Как я могу получить общее количество цифр в числе? - PullRequest
88 голосов
/ 19 декабря 2010

Как мне подсчитать общее количество цифр числа в C #? Например, номер 887979789 имеет 9 цифр.

Ответы [ 14 ]

140 голосов
/ 19 декабря 2010

Без преобразования в строку вы можете попробовать:

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

Исправление после комментария ysap:

Math.Floor(Math.Log10(n) + 1);
70 голосов
/ 19 декабря 2010

Попробуйте:

myint.ToString().Length

Это работает?

22 голосов
/ 29 июня 2018

Любое из этих расширений выполнит свою работу:

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 различных сценариях: 100 000 000 вызовов в цикле for, измеренных с помощью Stopwatch.

И ПОБЕДИТЕЛЬ ЕСТЬ ...

-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

САМАЯ НЕПРАВИЛЬНАЯ ВОЗМОЖНАЯ ВЕЩЬ!

12 голосов
/ 19 декабря 2010

Не напрямую C #, но формула: n = floor(log10(x)+1)

7 голосов
/ 14 декабря 2012

Ответы уже здесь работают для целых чисел без знака, но я не нашел хороших решений для получения количества цифр от десятичных и двойных чисел.

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, если точность имеет значение, но десятичное число также имеет предел.

5 голосов
/ 18 марта 2016

Ответ Стив правильный , но он не работает для целых чисел меньше 1.

Вот обновленная версия, которая работает для негативов:

int digits = n == 0 ? 1 : Math.Floor(Math.Log10(Math.Abs(n)) + 1)
5 голосов
/ 26 сентября 2014

Использование рекурсии (иногда спрашивается на собеседованиях)

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

    if (number >= 10)
        return CountDigits(number / 10) + 1;
    return 1;
 }
4 голосов
/ 19 декабря 2010
static void Main(string[] args)
{
    long blah = 20948230498204;
    Console.WriteLine(blah.ToString().Length);
}
1 голос
/ 19 декабря 2010

деление числа на 10 даст вам крайнюю левую цифру, затем, выполнив моду 10 на число, вы получите число без первой цифры и повторяйте это до тех пор, пока не получите все цифры

0 голосов
/ 20 сентября 2016

Предполагая, что ваш вопрос имеет отношение к int, следующие значения работают также для отрицательных / положительных и нулевых значений:

Math.Floor((decimal) Math.Abs(n)).ToString().Length
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...