2012-05-10 4 views
2

Я пытаюсь отформатировать мой double, чтобы быть в формате валюты в долларах США, но я не хочу отставать от 00, если значение получится целым числом.Строка форматирования - денежная стоимость

Я попытался

String.Format("{0:#,0.#0}", cost); 

и

String.Format("{0:#,0.##}", cost); 

Бывший покидает меня отставая 00 на целое число, а последняя даст мне 55.6, где я хочу 55.60. Как я могу отформатировать мою ценность для удовлетворения обеих этих потребностей?

ответ

2

Я не думаю, что это возможно со стандартной строкой формата, но трюк будет:

Regex.Replace(String.Format("{0:#,##0.00}", cost),"\\.00$",""); 

или:

string s = String.Format("{0:#,##0.00}", cost); 

if (s.EndsWith(".00")) 
    s = s.Substring(0,s.Length-3); 

Я знаю, это некрасиво ...

+0

Ха-ха, эй, он выполняет свою работу. Спасибо. ps - вы забываете каретку в '' \\. 00 $ "'? ''^\\. 00 $ "' –

+0

О, я понимаю, знак доллара означает, что ничего не прошло, но может быть что-то до этого. поэтому вы оставляете каретку –

4

Попробуйте примерно следующее:

var output = string.Format(((Math.Round(num) == num) ? "{0:0}" : "{0:0.00}"), num); 
+0

. Первая строка формата имеет ту же проблему, что и второй пример OP: она обрезает 55.60 до 55.6. Однако ваш второй пример работает. Вы должны отредактировать свой ответ. –

+0

@DanJ: Спасибо. Готово. –

+0

Приветствия - отменил мой голос. –

2

Попробуйте

string val = decimal.Parse("2.00").ToString("G29") 


?decimal.Parse("2.00").ToString("G29") 
"2" 
?decimal.Parse("2.02").ToString("G29") 
"2.02" 
?decimal.Parse("12.0045").ToString("G29") 
"12.0045" 
?decimal.Parse("0.0045").ToString("G29") 
"0.0045" 
?decimal.Parse("0.00").ToString("G29") 
"0" 
?decimal.Parse("0.05").ToString("G29") 
"0.05" 
+0

Вы тестировали это на разных номерах? –

+0

Я обновил свой комментарий. –

+0

+1: Просто протестировал его сам, и, похоже, он работает. Хорошее решение. –

1

Вы можете использовать Currency ("C") Format Specifier по телефону ToString. Никакой реальной работы не требуется.

Пример

string s = cost.ToString("C0"); // Where 0 is the precision 

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

static class CurrencyExtensions 
{ 
    public static String ToCurrency(this decimal d) { // Extend Decimal 
     if (d % 1 != 0) return d.ToString("C2"); 
     return d.ToString("C0"); 
    } 

    public static String ToCurrency(this double d) { // Extend Double 
     if (d % 1 != 0) return d.ToString("C2"); 
     return d.ToString("C0"); 
    } 
} 

Пример

decimal amount1 = 4m; 
decimal amount2 = 4.25m; 

string s1 = amount1.ToCurrency(); // $4 
string s2 = amount2.ToCurrency(); // $4.25 

Преимущество делать это таким образом над другими является то, что он обрабатывает информацию культуры для вас, и это гораздо более элегантное решение.

+0

Спасибо за ваш ответ! Мне придется вернуться к этому. Как это расширяет классы? С параметром 'this'? –

+0

Они называются 'Extension Methods'. http://msdn.microsoft.com/en-us/library/bb383977.aspx –

Смежные вопросы