Есть очень важная характеристика Decimal
, которая не очевидна:
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% случаев:
Decimal.Parse("25.0").ToString("c") => "$25.00"
Или в XAML вы использовали бы {Binding Price, StringFormat=c}
Я столкнулся с одним случаем, когда мне понадобилось десятичное число AS a decimal, когда я отправлял XML в веб-сервис Amazon. Служба жаловалась, потому что десятичное значение (первоначально из SQL Server) было отправлено как 25.1200
и отклонено (25.12
был ожидаемым форматом).
Все, что мне нужно было сделать, это Decimal.Round(...)
с двумя десятичными знаками, чтобы решить проблему независимо от источника значения.
// generated code by XSD.exe
StandardPrice = new OverrideCurrencyAmount()
{
TypedValue = Decimal.Round(product.StandardPrice, 2),
currency = "USD"
}
TypedValue
относится к типу Decimal
, поэтому я не мог просто сделать ToString("N2")
, и мне нужно было округлить его и оставить как decimal
.
person
Simon_Weaver
schedule
26.10.2011