C#で数値の総桁数のカウントを取得するにはどうすればよいですか?たとえば、887979789という数字は9桁です。
文字列に変換せずに試すことができます:
Math.Ceiling(Math.Log10(n));
ysapのコメントに続く修正:
Math.Floor(Math.Log10(n) + 1);
これを試して:
myint.ToString().Length
それは動作しますか ?
これらの拡張機能のいずれかが仕事をします:
public static class Int32Extensions
{
// THE MATHEMATICALLY FORMULATED ONE:
public static int Digits1(this Int32 n) =>
n == 0 ? 1 : 1 + (int) Math.Log10(Math.Abs(n));
// TYPICAL PROGRAMMING APPROACH:
public static int Digits2(this Int32 n)
{
int digits = 0;
do { ++digits; n /= 10; } while (n != 0);
return digits;
}
// THE UGLIEST POSSIBLE THING:
public static int Digits3(this Int32 n)
{
n = Math.Abs(n);
if (n < 10) return 1;
if (n < 100) return 2;
if (n < 1000) return 3;
if (n < 10000) return 4;
if (n < 100000) return 5;
if (n < 1000000) return 6;
if (n < 10000000) return 7;
if (n < 100000000) return 8;
if (n < 1000000000) return 9;
return 10;
}
// THE LOCOMOTIVE PULLING CHARACTERS:
public static int Digits4(this Int32 n) =>
n >= 0 ? n.ToString().Length : n.ToString().Length - 1;
}
5つの異なるシナリオで、Stopwatch
で測定されたforループでの100.000.000の呼び出しで、これらのパフォーマンステストを行いました。
および受賞者IS ...
-1000000000.Digits1() => 1806 ms
-1000000000.Digits2() => 4114 ms
-1000000000.Digits3() => 664 ms <<<
-1000000000.Digits4() => 13600 ms
-1000.Digits1() => 1839 ms
-1000.Digits2() => 1163 ms
-1000.Digits3() => 429 ms <<<
-1000.Digits4() => 9959 ms
0.Digits1() => 166 ms <<<
0.Digits2() => 369 ms
0.Digits3() => 165 ms <<<
0.Digits4() => 7416 ms
1000.Digits1() => 1578 ms
1000.Digits2() => 1182 ms
1000.Digits3() => 328 ms <<<
1000.Digits4() => 9296 ms
1000000000.Digits1() => 1596 ms
1000000000.Digits2() => 4074 ms
1000000000.Digits3() => 581 ms <<<
1000000000.Digits4() => 13679 ms
最も可能性の高いもの!
直接C#ではなく、式はn = floor(log10(x)+1)
ここでの回答はすでに符号なし整数で機能しますが、小数と倍数から桁数を取得するための適切なソリューションは見つかりませんでした。
public static int Length(double number)
{
number = Math.Abs(number);
int length = 1;
while ((number /= 10) >= 1)
length++;
return length;
}
//number of digits in 0 = 1,
//number of digits in 22.1 = 2,
//number of digits in -23 = 2
精度が重要な場合、入力タイプをdouble
からdecimal
に変更できますが、10進数にも制限があります。
再帰の使用(インタビューで質問される場合があります)
public int CountDigits(int number)
{
// In case of negative numbers
number = Math.Abs(number);
if (number >= 10)
return CountDigits(number / 10) + 1;
return 1;
}
Steveは正しい の答えですが、1未満の整数では機能しません。
ここでは、ネガに対して機能する更新されたバージョン:
int digits = n == 0 ? 1 : Math.Floor(Math.Log10(Math.Abs(n)) + 1)
static void Main(string[] args)
{
long blah = 20948230498204;
Console.WriteLine(blah.ToString().Length);
}
数値を10で除算すると、左端の桁が得られ、その数値に対してmod 10を実行すると、最初の桁のない数値が得られ、すべての桁が得られるまで繰り返します。
int i = 855865264;
int NumLen = i.ToString().Length;