web-dev-qa-db-ja.com

数字の合計桁数のカウントを取得するにはどうすればよいですか?

C#で数値の総桁数のカウントを取得するにはどうすればよいですか?たとえば、887979789という数字は9桁です。

90
Arash

文字列に変換せずに試すことができます:

Math.Ceiling(Math.Log10(n));

ysapのコメントに続く修正:

Math.Floor(Math.Log10(n) + 1);
143
Steve

これを試して:

myint.ToString().Length

それは動作しますか ?

71
Andiih

これらの拡張機能のいずれかが仕事をします:

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

最も可能性の高いもの!

24

直接C#ではなく、式はn = floor(log10(x)+1)

13
ysap

ここでの回答はすでに符号なし整数で機能しますが、小数と倍数から桁数を取得するための適切なソリューションは見つかりませんでした。

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進数にも制限があります。

8
nawfal

再帰の使用(インタビューで質問される場合があります)

public int CountDigits(int number)
{
    // In case of negative numbers
    number = Math.Abs(number);

    if (number >= 10)
        return CountDigits(number / 10) + 1;
    return 1;
 }
5
user2673195

Steveは正しい の答えですが、1未満の整数では機能しません。

ここでは、ネガに対して機能する更新されたバージョン:

int digits = n == 0 ? 1 : Math.Floor(Math.Log10(Math.Abs(n)) + 1)
5
Patrick Hofman
static void Main(string[] args)
{
    long blah = 20948230498204;
    Console.WriteLine(blah.ToString().Length);
}
4
weloytty

数値を10で除算すると、左端の桁が得られ、その数値に対してmod 10を実行すると、最初の桁のない数値が得られ、すべての桁が得られるまで繰り返します。

1
romejoe
int i = 855865264;
int NumLen = i.ToString().Length;
0
Javed Akram