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