“子串”是一个数值

时间:2012-05-11 08:14:18

标签: c#

在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。

3 个答案:

答案 0 :(得分: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位有效数字。事实证明,这与将除以 n的幂相同。由于c#没有指数运算符(如python中的**),我们使用库函数:

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

我们需要把它重新投入很长时间:

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

我认为现在你已经完成了自己的所有功能;)

答案 1 :(得分:7)

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

123456 % 100000 = 23456

123456 % 1000 = 456

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

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

long number = 1234567890123456789L;
long divisor = 10000000000000000L;
long result = number % divisor;

答案 2 :(得分: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

<击>


注意:

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