.netperformancestringmath

Finding the string length of a integer in .NET


In .NET what is the best way to find the length of an integer in characters if it was represented as a string?

e.g.

1 = 1 character
10 = 2 characters
99 = 2 characters
100 = 3 characters
1000 = 4 characters

The obvious answer is to convert the int to a string and get its length but I want the best performance possible without the overhead of creating a new string.


Solution

  • you can use logartihms to calculate the length of the int:

    public static int IntLength(int i) {
      if (i <= 0) throw new ArgumentOutOfRangeException();
    
      return (int)Math.Floor(Math.Log10(i)) + 1;
    }
    

    the test passes:

    [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));
    }
    

    a quick test has shown that the log-method is 4 times faster than the int.ToString().Length method..

    the method shown by GvS below (using if-statements) is another 6 times (!) faster than the log method:

    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();
    }
    

    here are the exact timings for the numbers 1 to 10000000:

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