在.NET中查找整数的字符串长度

时间:2010-03-24 09:23:10

标签: .net performance string math

在.NET中,如果字符表示为字符串,那么查找字符整数长度的最佳方法是什么?

e.g。

1 = 1个字符
10 = 2个字符
99 = 2个字符
100 = 3个字符
1000 = 4个字符

显而易见的答案是将int转换为字符串并获取其长度,但我希望尽可能获得最佳性能而无需创建新字符串的开销。

6 个答案:

答案 0 :(得分:37)

你可以使用logartihms来计算int的长度:

public static int IntLength(int i) {
  if (i <= 0) throw new ArgumentOutOfRangeException();

  return (int)Math.Floor(Math.Log10(i)) + 1;
}

测试通过:

[Test]
public void TestIntLength() {
  Assert.AreEqual(1, IntLength(1));
  Assert.AreEqual(1, IntLength(9));
  Assert.AreEqual(2, IntLength(10));
  Assert.AreEqual(2, IntLength(99));
  Assert.AreEqual(3, IntLength(100));
  Assert.AreEqual(3, IntLength(999));
  Assert.AreEqual(4, IntLength(1000));
  Assert.AreEqual(10, IntLength(int.MaxValue));
}

快速测试表明,log-method比int.ToString()快4倍。长度方法..

下面的GvS所示的方法(使用if语句)比log方法快6倍(!):

public static int IntLengthIf(int i) {
  if (i < 10) return 1;
  if (i < 100) return 2;
  if (i < 1000) return 3;
  if (i < 10000) return 4;
  if (i < 100000) return 5;
  if (i < 1000000) return 6;
  if (i < 10000000) return 7;
  if (i < 100000000) return 8;
  if (i < 1000000000) return 9;
  throw new ArgumentOutOfRangeException();
}

以下是数字1到10000000的确切时间:

IntLengthToString: 4205ms
IntLengthLog10: 1122ms
IntLengthIf: 201ms

答案 1 :(得分:12)

如果输入范围为0-10000

if (i < 10) return 1;
if (i < 100) return 2;
if (i < 1000) return 3;
if (i < 10000) return 4;
// etc

答案 2 :(得分:3)

您可以使用以下内容:

        int integer = 100;

        int charachtersCount = 0;
        while (integer > 0)
        {
            integer = integer/10;
            charachtersCount++;
        }

但你真的需要对此进行优化吗?我实际上更喜欢使用字符串(看起来好多了):

integer.ToString().Length

答案 3 :(得分:1)

如果您还需要处理负数,可以使用stmax solution旋转:

public static int IntLength(int i) { 
  if (i == 0) return 1; // no log10(0)
  int n = (i < 0) ? 2 : 1;
  i = (i < 0) ? -i : i;

  return (int)Math.Floor(Math.Log10(i)) + n; 
} 

答案 4 :(得分:1)

你可以这样做:

int ndig = 1;
if (n < 0){n = -n; ndig++;}
if (n >= 100000000){n /= 100000000; ndig += 8;}
if (n >=     10000){n /=     10000; ndig += 4;}
if (n >=       100){n /=       100; ndig += 2;}
if (n >=        10){n /=        10; ndig += 1;}

或类似的东西。它需要4次比较和0-4次分裂。

(在64位上你必须添加第五级。)

答案 5 :(得分:-1)

如果你想通过数学来做,你可以试试这个:

int integer = 100
int charCount = (int) Math.Ceiling(Math.Log10(integer+1));

我怀疑这是否比转换为字符串要快得多