在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。
答案 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);
<击> 在您使用模数方法开悟之前,您可以选择此方法,而不是同时:
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);
<击> 撞击>
注意:
强烈推荐,使用modulo方法,不要使用减法。 Modulo方法是最好的,没有极端情况,即不需要使用if
语句。