Как мне отформатировать десятичную C # для удаления лишних следующих 0? - PullRequest
46 голосов
/ 24 января 2011

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

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

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

Ответы [ 11 ]

80 голосов
/ 25 января 2011

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

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

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

21 голосов
/ 06 апреля 2011
string s = d.ToString("0.#############################");
4 голосов
/ 24 января 2011

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

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

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
    }
}

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

3 голосов
/ 30 апреля 2015

В отличие от того, что все предлагают использовать спецификатор формата 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
3 голосов
/ 24 января 2011

Как насчет:

string FormatDecimal(decimal d)
{
    const char point = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0];
    string s = d.ToString();
    // if there's no decimal point, there's 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);
}
3 голосов
/ 24 января 2011

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

String.Format("{0:0.000}", x);
2 голосов
/ 24 января 2011

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

decimal a = 100.00M;
string strNumber = string.Format("{0}", a);
Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber);
2 голосов
/ 24 января 2011

Довольно много ответов уже. Я часто ссылаюсь на этот шпаргалку: http://blog.stevex.net/string-formatting-in-csharp/

1 голос
/ 24 января 2011

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

var s = String.Format("{0:#####.###}");
1 голос
/ 24 января 2011
String.Format("{0:0.##}", 123.0); // "123"
...