Как отформатировать двойную валюту, округленную до ближайшего доллара?

Прямо сейчас у меня есть

double numba = 5212.6312
String.Format("{0:C}", Convert.ToInt32(numba) )

Это даст мне

$5,213.00

но я не хочу ".00".

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


person spilliton    schedule 20.05.2009    source источник
comment
numba - плохое имя для переменной... Еще один символ дал бы вам число   -  person Omar Kooheji    schedule 21.05.2009
comment
Омар прав, однако число также является дерьмовым именем для переменной.   -  person Sam Axe    schedule 21.05.2009


Ответы (5)


Во-первых, не храните валюту в double — вместо этого используйте decimal. Каждый раз. Затем используйте «C0» в качестве спецификатора формата:

decimal numba = 5212.6312M;
string s = numba.ToString("C0");
person Marc Gravell    schedule 20.05.2009
comment
Никакая плавающая точка не должна использоваться в качестве поля валюты. Целое число, хранящееся в центах/пенсах/наименьших допустимых единицах валюты, является единственным способом избежать ошибок округления (и библиотека BigInt, если вам нужны числа за пределами длинного диапазона целых чисел :)) - person workmad3; 21.05.2009
comment
Целое число имеет те же проблемы с округлением, что и десятичное... десятичное число - это, по сути, большое целое число со спецификатором точности. Большинство вещей, которые вы можете делать с int, вы можете делать с decimal, плюс decimal — 96-битный (а не 32 или 64 для int и long). Большинство валют умещаются в 96 бит... - person Marc Gravell; 21.05.2009
comment
Я поддержу запрет на использование двойников в качестве валюты. Неточность может привести к проблемам, а в крайнем случае и к проверкам. - person Jacob Proffitt; 21.05.2009
comment
Я бы только добавил, что запрет на использование чисел с плавающей запятой для денежных сумм не всегда актуален. Например, с неточными прогнозами на будущее вполне подойдут двойники. - person Mark Pattison; 16.06.2009
comment
Вот не совсем согласен. Большинство инвестиционных банков хранят свои ценности в двойном размере. Пока вы знаете, что делаете, и знаете об отменах и проблемах с точностью, все должно быть в порядке. - person Mats Fredriksson; 16.06.2009
comment
Вероятно, стоит отметить, что производительность двойных чисел также намного лучше, чем десятичных дробей в .NET. - person geedubb; 12.02.2015
comment
@geedubb, хотя это правда, обычно не имеет значения, как быстро вы получите неправильный ответ; p - person Marc Gravell; 12.02.2015
comment
@MarcGravell, ха-ха, очень верно;) - person geedubb; 12.02.2015

Это должно сделать работу:

String.Format("{0:C0}", Convert.ToInt32(numba))

Число после C указывает количество десятичных разрядов, которое необходимо включить.

Я подозреваю, что вы действительно хотите использовать decimal тип для хранения таких чисел однако.

person Noldorin    schedule 20.05.2009

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

Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalDigits = 0;

и только тогда вы должны сделать вызов Format:

String.Format("{0:C0}", numba) 
person Pejvan    schedule 16.06.2009

 decimal value = 0.00M;
        value = Convert.ToDecimal(12345.12345);
        Console.WriteLine(".ToString(\"C\") Formates With Currency $ Sign");
        Console.WriteLine(value.ToString("C"));
        //OutPut : $12345.12
        Console.WriteLine(value.ToString("C1"));
        //OutPut : $12345.1
        Console.WriteLine(value.ToString("C2"));
        //OutPut : $12345.12
        Console.WriteLine(value.ToString("C3"));
        //OutPut : $12345.123
        Console.WriteLine(value.ToString("C4"));
        //OutPut : $12345.1235
        Console.WriteLine(value.ToString("C5"));
        //OutPut : $12345.12345
        Console.WriteLine(value.ToString("C6"));
        //OutPut : $12345.123450

щелкните, чтобы увидеть экран вывода консоли

Надеюсь, это поможет вам...

Спасибо. :)

person Bhanu Pratap    schedule 25.07.2016

просто: numba.ToString("C2")

больше @ http://msdn.microsoft.com/pt-br/library/dwhawy9k(v=vs.110).aspx#CFormatString

person Rodrigo Reis    schedule 26.09.2014