Подтвердить что ты не робот

Как форматировать десятичное число С#, чтобы удалить дополнительные следующие 0?

Я хочу отформатировать строку как десятичную, но десятичное число содержит следующие нули после десятичной. Как его форматировать так, чтобы исчезли эти бессмысленные 0?

string.Format("{0}", 1100M);
string.Format("{0}", 1100.1M);
string.Format("{0}", 1100.100M);
string.Format("{0}", 1100.1000M);

отображается:

1100
1100.1
1100.100
1100.1000

но я хочу, чтобы это было:

1100
1100.1
1100.1
1100.1

Для справки, вот другие вопросы, которые по сути являются дубликатами этого, что я нашел благодаря ответам, приведенным здесь:

4b9b3361

Ответ 1

Вы можете использовать ToString() с спецификатором формата() для для достижения желаемого результата, Заканчивающиеся нули усекаются при использовании этой строки формата с заданной точностью. Чтобы предотвратить округление в любых ситуациях, вам необходимо установить точность максимально допустимой для десятичных знаков (29).

Строка кода для создания того, что вы хотите, это number.ToString("G29"), где number - ваш исходный десятичный знак.

Имейте в виду, что любые числа, меньшие 0,0001, будут преобразованы в научную нотацию. Более подробную информацию о том, как работает этот форматировщик, можно найти в ссылке выше.

Ответ 2

string s = d.ToString("0.#############################");

Ответ 3

Они не обязательно бессмысленны - они указывают точность во время расчета. Десятичные числа сохраняют свой уровень точности, а не нормализуются.

У меня есть код в этом ответе, который вернет нормализованное значение - вы можете использовать его, а затем отформатировать результат. Например:

using System;
using System.Numerics;

class Test
{
    static void Display(decimal d)
    {
        d = d.Normalize(); // Using extension method from other post
        Console.WriteLine(d);
    }

    static void Main(string[] args)
    {
        Display(123.4567890000m); // Prints 123.456789
        Display(123.100m);        // Prints 123.1
        Display(123.000m);        // Prints 123
        Display(123.4567891234m); // Prints 123.4567891234
    }
}

Я подозреваю, что большинство подстрок строк формата не сработают. Я бы предположил, что строка формата "0." а затем 28 # символов будут работать, но это было бы очень уродливо...

Ответ 4

Вы можете указать строку формата следующим образом:

String.Format("{0:0.000}", x);

Ответ 5

Как насчет:

string FormatDecimal(decimal d)
{
    const char point = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0];
    string s = d.ToString();
    // if there no decimal point, there nothing to trim
    if (!s.Contains(point) == -1)
        return s;
    // trim any trailing 0s, followed by the decimal point if necessary
    return s.TrimEnd('0').TrimEnd(point);
}

Ответ 6

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

{0:#,#.##}

Результат этого формата в большинстве случаев намного лучше, чем G:

String.Format("{0:#,#.##}",25/2.4);
10.42

String.Format("{0:#,#.##}",1000000);
1,000,000

String.Format("{0:#,#.##}",1000000.3600000);
1,000,000.36

И спецификатор G не может справиться со всеми возможными комбинациями:

String.Format("{0:G29}",25/2.4);
10.416666666666668

String.Format("{0:G2}",25/2.4);
10

String.Format("{0:G29}",1000000.3600000);
1000000.36

String.Format("{0:G2}",1000000.3600000);
1E+06

Ответ 8

String.Format("{0:0.##}", 123.0); // "123"

Ответ 9

Я считаю, что вы хотите сделать:

var s = String.Format("{0:#####.###}");

Ответ 10

Немного хакерский, но это должно работать:

decimal a = 100.00M;
string strNumber = string.Format("{0}", a);
Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber);

Ответ 11

double a = 1100.00
double  b =1100.1
double  c = 1100.100
double  d =1100.1000

Remove last zero after point


string stra = a.toString("0.00").TrimEnd('0').TrimEnd('.');
string strb = b.toString("0.00").TrimEnd('0').TrimEnd('.');
string strc = c.toString("0.00").TrimEnd('0').TrimEnd('.');
string strd = d.toString("0.00").TrimEnd('0').TrimEnd('.');

Output

1100
1100.1
1100.1
1100.1