При выводе значения десятичной дроби в настоящее время с помощью .ToString()
, она точна до 15 знаков после запятой, а поскольку я использую ее для представления долларов и центов, я хочу, чтобы на выходе было только 2 знака после запятой.
Использую ли я для этого какой-нибудь вариант .ToString()
?
decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0
или
decimalVar.ToString ("0.##"); // returns "0" when decimalVar == 0
Я знаю, это старый вопрос, но я был удивлен, увидев, что никто, казалось, чтобы ответить на этот вопрос;
Это то, что я хотел бы использовать:
decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);
decimalVar.ToString("F");
Это:
Идеально подходит для валюты и отображения денежных сумм.
К документации на метод toString (на"Е" - а): http://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx#FFormatString (благодаря Джон Шнайдер)
Если вам это нужно только для отображения, используйте string.Format
String.Format("{0:0.00}", 123.4567m); // "123.46"
http://www.csharp-examples.net/string-format-double/
Суффикс "m" является десятичным суффиксом. О десятичном суффиксе:
Учитывая десятичное д=12.345; выражения й.Метод toString (на"в глаз") или строки.Формат (на"{0:С}", у, г) доходность 12.35 $ - обратите внимание, что текущая культура'используемые настройки валюты в том числе и символ.
Обратите внимание, что "и с" и использует ряд цифр от текущей культуры. Вы всегда можете переопределить значение по умолчанию в силу необходимой точности с с{описатель точности}
, как строка.Формат (на"{0:С2} себе", 5.123 д)
.
Если вы хотите, чтобы он отформатирован с запятыми, а также десятичную запятую (но без символа валюты), такие как 3,456,789.12...
decimalVar.ToString("n2");
Там's уже два высоко оцененных ответов, которые обращаются в десятичные.Круглый(...) но я думаю, что нужно немного больше объяснение - потому что там'с неожиданной важное свойство десятичной, что это'т очевиден.
Десятичное 'не знает' сколько знаков после запятой имеет зависимости, откуда он взялся.
Например, следующим может быть неожиданным :
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"
Делаем те же операции с "двойным" даст никаких десятичных знаков (в"25"
В) для каждого из перечисленных выше.
Когда вы хотите десятичное число до 2 знаков после запятой там около 95% шанс, что это's, потому что он'ы валюты в этом случае это, наверное, нормально для 95% времени:
Decimal.Parse("25.0").ToString("c") => "$25.00"
Или в XAML вы просто использовать {привязки цене, StringFormat=с}
В одном случае я столкнулся, когда мне нужен был десятичное число как десятичное, когда отправка документов XML в Amazon'с веб. Обслуживание было жаловаться, потому что десятичное значение (первоначально из SQL сервера) был послан как 25.1200 и отклонено, (`25.12-последовал ожидаемый формат).
Все, что мне нужно было `десятичное.Круглый (...) с 2 знаками после запятой, чтобы исправить проблему.
// This is an XML message - with generated code by XSD.exe
StandardPrice = new OverrideCurrencyAmount()
{
TypedValue = Decimal.Round(product.StandardPrice, 2),
currency = "USD"
}
TypedValue
имеет тип десятичное число
так что я не мог'Т просто сделать метод toString (на"Н2-то"), и ей нужно, чтобы вокруг него и сохранить его как
десятичное число`.
Вот маленькая программа, помощью 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
===================
Очень редко вы хотите пустую строку, если значение равно 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 минут (большинство) люди's время.
Ни один из этих сделал именно то, что мне нужно, чтобы силу 2 д. стр. и круглый, как 0.005 -> 0.01
Принуждение 2 сут.С. требует увеличения точности 2 сут.С. чтобы у нас было как минимум 2 сут.С.
затем округления, чтобы гарантировать, что мы не имеем более 2 сут.С.
Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)
6.665m.ToString() -> "6.67"
6.6m.ToString() -> "6.60"
Топ-рейтинг ответа описывает способ форматирования строковое представление в десятичное значение, и это работает.
Однако, если вы действительно хотите изменить точность сохраняется на фактическое значение, нужно написать что-то вроде следующего:
public static class PrecisionHelper
{
public static decimal TwoDecimalPlaces(this decimal value)
{
// These first lines eliminate all digits past two places.
var timesHundred = (int) (value * 100);
var removeZeroes = timesHundred / 100m;
// In this implementation, I don't want to alter the underlying
// value. As such, if it needs greater precision to stay unaltered,
// I return it.
if (removeZeroes != value)
return value;
// Addition and subtraction can reliably change precision.
// For two decimal values A and B, (A + B) will have at least as
// many digits past the decimal point as A or B.
return removeZeroes + 0.01m - 0.01m;
}
}
Пример юнит-теста:
[Test]
public void PrecisionExampleUnitTest()
{
decimal a = 500m;
decimal b = 99.99m;
decimal c = 123.4m;
decimal d = 10101.1000000m;
decimal e = 908.7650m
Assert.That(a.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("500.00"));
Assert.That(b.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("99.99"));
Assert.That(c.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("123.40"));
Assert.That(d.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("10101.10"));
// In this particular implementation, values that can't be expressed in
// two decimal places are unaltered, so this remains as-is.
Assert.That(e.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("908.7650"));
}
Вы можете использовать систему.глобализация форматировать число в любой нужный формат.
Например:
system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");
Если у вас есть десятичное д = 1.2300000 и вам нужно обрезать его до 2 знаков после запятой, то он может быть напечатан такой `д'.Метод toString (на"Ф2-то",Ки); где Ф2-строка форматирования до 2 знаков после запятой и CI-локаль или CultureInfo.
для получения дополнительной информации, проверьте эту ссылку http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Майк м.'ы ответ был идеальным для меня .Чистый, но .Объем ядра не'т иметь десятичную.Способ круглый в момент написания.
В .Чистая сердечник, мне пришлось использовать:
decimal roundedValue = Math.Round(rawNumber, 2, MidpointRounding.AwayFromZero);
Метод суховато, включая преобразование в строки, является:
public string FormatTo2Dp(decimal myNumber)
{
// Use schoolboy rounding, not bankers.
myNumber = Math.Round(myNumber, 2, MidpointRounding.AwayFromZero);
return string.Format("{0:0.00}", myNumber);
}
https://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx
По этой ссылке подробно описано, как можно решить вашу проблему и что вы можете сделать, если вы хотите узнать больше. Для целей простоты, что вы хотите сделать, это
double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");
если вы хотите это для валюты, можно сделать проще, нажав "и что quot С2&;, а не "по Ф2 и"
Double Amount = 0;
string amount;
amount=string.Format("{0:F2}", Decimal.Parse(Amount.ToString()));