Как округлить десятичное значение до 2 десятичных знаков (для вывода на страницу) - PullRequest
582 голосов
/ 03 октября 2008

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

Использую ли я для этого вариант .ToString()? 1005 *

Ответы [ 15 ]

822 голосов
/ 03 октября 2008
decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0

или

decimalVar.ToString ("0.##"); // returns "0"  when decimalVar == 0
546 голосов
/ 20 апреля 2011

Я знаю, что это старый вопрос, но я был удивлен, увидев, что никто, похоже, не опубликовал ответ, который;

  1. Не использовал округление банкиров
  2. Не сохранять значение в виде десятичной дроби.

Вот что я бы использовал:

decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);

http://msdn.microsoft.com/en-us/library/9s0xa85y.aspx

309 голосов
/ 15 декабря 2009
decimalVar.ToString("F");

Это будет:

  • Округление до 2 десятичных знаков, например. 23,456 => 23,46
  • Убедитесь, что там всегда 2 знака после запятой, например. 23 => 23,00, 12,5 => 12,50

Идеально для валюты и отображения денежных сумм.

Для документации по ToString ("F"): http://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx#FFormatString (с благодарностью Джону Шнайдеру)

100 голосов
/ 03 октября 2008

Если вам нужно это для отображения, используйте строку. Формат

String.Format("{0:0.00}", 123.4567m);      // "123.46"

http://www.csharp -examples.net / строка формата двойной /

"m" - десятичный суффикс. О десятичном суффиксе:

http://msdn.microsoft.com/en-us/library/364x0z75.aspx

54 голосов
/ 03 октября 2008

Дано десятичное d = 12,345; выражения d.ToString ("C") или String.Format ("{0: C}", d) yield $ 12,35 - обратите внимание, что используются текущие настройки валюты культуры, включая символ.

Обратите внимание, что "C" использует количество цифр из текущей культуры. Вы всегда можете переопределить значение по умолчанию, чтобы добиться необходимой точности с помощью C{Precision specifier}, как String.Format("{0:C2}", 5.123d).

44 голосов
/ 22 апреля 2009

Если вы хотите, чтобы оно форматировалось с запятыми, а также с десятичной точкой (но без символа валюты), например, 3 456 789,12 ...

decimalVar.ToString("n2");
28 голосов
/ 26 октября 2011

Уже есть два ответа с высокими оценками, которые относятся к Decimal.Round (...), но я думаю, что требуется немного больше объяснений - потому что есть неожиданное важное свойство Decimal, которое не очевидно.

Десятичное число «знает», сколько десятичных разрядов оно основало на том, откуда оно пришло.

Например, следующее может быть неожиданным:

Decimal.Parse("25").ToString()          =>   "25"
Decimal.Parse("25.").ToString()         =>   "25"
Decimal.Parse("25.0").ToString()        =>   "25.0"
Decimal.Parse("25.0000").ToString()     =>   "25.0000"

25m.ToString()                          =>   "25"
25.000m.ToString()                      =>   "25.000"

Выполнение тех же операций с Double не даст десятичных разрядов ("25") для каждого из вышеперечисленных.

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

Decimal.Parse("25.0").ToString("c")     =>   "$25.00"

Или в XAML вы просто используете {Binding Price, StringFormat=c}

В одном случае я столкнулся с необходимостью использования десятичного разделителя в качестве десятичного разделителя при отправке XML на веб-сервис Amazon. Служба жаловалась, потому что десятичное значение (первоначально из SQL Server) было отправлено как 25.1200 и отклонено (25.12 был ожидаемый формат).

Все, что мне нужно было сделать, это Decimal.Round(...) с двумя десятичными знаками для решения проблемы.

 // This is an XML message - with generated code by XSD.exe
 StandardPrice = new OverrideCurrencyAmount()
 {
       TypedValue = Decimal.Round(product.StandardPrice, 2),
       currency = "USD"
 }

TypedValue относится к типу Decimal, поэтому я не мог просто сделать ToString("N2"), и мне нужно было округлить его и сохранить как decimal.

21 голосов
/ 19 ноября 2013

Вот небольшая программа Linqpad для отображения разных форматов:

void Main()
{
    FormatDecimal(2345.94742M);
    FormatDecimal(43M);
    FormatDecimal(0M);
    FormatDecimal(0.007M);
}

public void FormatDecimal(decimal val)
{
    Console.WriteLine("ToString: {0}", val);
    Console.WriteLine("c: {0:c}", val);
    Console.WriteLine("0.00: {0:0.00}", val);
    Console.WriteLine("0.##: {0:0.##}", val);
    Console.WriteLine("===================");
}

Вот результаты:

ToString: 2345.94742
c: $2,345.95
0.00: 2345.95
0.##: 2345.95
===================
ToString: 43
c: $43.00
0.00: 43.00
0.##: 43
===================
ToString: 0
c: $0.00
0.00: 0.00
0.##: 0
===================
ToString: 0.007
c: $0.01
0.00: 0.01
0.##: 0.01
===================
15 голосов
/ 03 октября 2008
9 голосов
/ 01 августа 2017

Очень редко вы захотите пустую строку, если значение равно 0.

decimal test = 5.00;
test.ToString("0.00");  //"5.00"
decimal? test2 = 5.05;
test2.ToString("0.00");  //"5.05"
decimal? test3 = 0;
test3.ToString("0.00");  //"0.00"

Ответ с самым высоким рейтингом неверен и потратил 10 минут времени (большинства) людей.

...