2012-05-10 77 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

可以通過調用ToString使用Currency ("C") Format Specifier。沒有實際的工作要求。

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

他們被稱爲'擴展方法'。 http://msdn.microsoft.com/en-us/library/bb383977.aspx –