3

在 C# 中,“子串”(因为没有更好的词)长值的最佳方法是什么。

我需要计算拖车记录的帐号总和,但只需要 16 个最低有效字符。

我可以通过将值转换为字符串来做到这一点,但想知道是否有更好的方法可以做到这一点。

long number = 1234567890123456789L;
const long _MAX_LENGTH = 9999999999999999L;

if (number > _MAX_LENGTH)
{
  string strNumber = number.ToString();
  number = Convert.ToInt64(strNumber.Substring(strNumber.Length - 16));
}

这将返回值 4567890123456789。

4

3 回答 3

8

你可以这样做:

long number = 1234567890123456789L;
long countSignificant = 16;
long leastSignificant = number % (long) Math.Pow(10, countSignificant);

这是如何运作的?好吧,如果你除以 10,你会去掉最后一位,对吧?其余的将是最后一个数字?100、1000 和Math.Pow(1, n).

让我们只看最不重要的数字,因为我们可以在脑海中做到这一点:

1234 除以 10 是 123 余数 4

在 c# 中,这将是:

1234 / 10 == 123;
1234 % 10 == 4;

因此,下一步是弄清楚如何获得最后 n 个有效数字。事实证明,这与除以 10n 次方相同。由于 c# 没有指数运算符(如**在 python 中),我们使用库函数:

Math.Pow(10, 4) == 1000.0; // oops: a float!

我们需要把它改回很长:

(long) Math.Pow(10, 4) == 1000;

我认为现在您拥有创建自己的好功能的所有部分;)

于 2012-05-11T08:16:12.030 回答
7

您可以使用模(%C# 中的运算符)。例如:

123456 % 100000 = 23456

或者

123456 % 1000 = 456

作为一个快速指南,我一直记得你得到的数字与除数中的零一样多。或者,反之亦然,除数需要尽可能多的零来保留数字。

所以在你的情况下,你需要:

long number = 1234567890123456789L;
long divisor = 10000000000000000L;
long result = number % divisor;
于 2012-05-11T08:16:34.640 回答
1

完整代码,使用模运算符:

long number = 1234567890123456789L;
const long _MAX_LENGTH = 9999999999999999L;

number = number % (_MAX_LENGTH + 1);                

Console.WriteLine (number);

现场测试:http: //ideone.com/pKB6w


在您对模数方法有所启发之前,您可以同时选择此方法:

long number = 1234567890123456789L;
const long _MAX_LENGTH = 9999999999999999L;


if (number > _MAX_LENGTH) {             
    long minus = number / (_MAX_LENGTH +  1) * (_MAX_LENGTH +  1);              
    number = number - minus;
}

Console.WriteLine(number);

现场测试:http: //ideone.com/oAkcy


笔记:

强烈推荐,使用取模方法,不要使用减法。模数方法是最好的,没有极端情况,即不需要使用if语句。

于 2012-05-11T08:36:45.733 回答