Finding the string length of a integer in .NET

后端 未结 6 609
小鲜肉
小鲜肉 2020-12-28 18:12

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

相关标签:
6条回答
  • 2020-12-28 18:16

    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
    
    0 讨论(0)
  • 2020-12-28 18:16

    If input is in range 0-10000

    if (i < 10) return 1;
    if (i < 100) return 2;
    if (i < 1000) return 3;
    if (i < 10000) return 4;
    // etc
    
    0 讨论(0)
  • 2020-12-28 18:22

    If you need to deal with negative numbers also, you can take stmax solution with a spin:

    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; 
    } 
    
    0 讨论(0)
  • 2020-12-28 18:33

    If you want to do it by maths you could try this:

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

    I doubt if this is very much faster than converting to a string though

    0 讨论(0)
  • 2020-12-28 18:36

    You could use something like this:

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

    But do you really need to optimize this? I would actually prefer using string (looks much better):

    integer.ToString().Length
    
    0 讨论(0)
  • 2020-12-28 18:41

    You can do:

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

    or something along those lines. It takes 4 comparisons and 0-4 divisions.

    (On 64 bits you have to add a fifth level.)

    0 讨论(0)
提交回复
热议问题