2013-10-25 64 views
3

我想寫的是將圓或鍵盤的數字到小數點後兩位的字符串格式,同時還顯示與他們周圍的括號負數小負數。這是在WPF應用程序中,但它適用於任何.net StringFormat用例。例如:有問題的StringFormat對於已四捨五入

  • 2.0 - > 2.00
  • -2.0 - >(2.00)
  • 0.01 - > 0.01
  • -0.01 - >(0.01)
  • 0.001 - > 0.00
  • -0.001 - >(0.00)

最後一個,一個非常小的負數舍入到零是問題所在。我仍然希望括號指出它是否定的。

我的第一個版本是一個字符串格式如下:

{0:#,##0.00 ;(#,##0.00)} 

這是不行的,因爲它正/負,由此推定該0.00是不是消極的應用切換前幾輪的數量。

我然後嘗試這樣,在托架邏輯分離成其自己的格式塊,前後數後:

{0:;(}{0:#,##0.00 ;#,##0.00}{0:;)} 

奇怪的是,然而,這表現出相同的行爲與原始示例。它適用於-0.01,但仍然不顯示-0.001的括號。不知何故,第一個和最後一個標記必須在中間的數字顯示標記的舍入行爲中進行選擇。

有沒有人有關於如何格式化這個所以它的工作原理我怎麼想的想法?

+0

顯然是一個錯誤。有誰知道這是否已經修復在一個新的.Net版本? (我有.Net 4.0)。有沒有人知道可以在XAML中使用的解決方法,而無需創建專用的Converter類?最後,如果錯誤得到解決,是否會產生潛在的嚴重向後兼容性問題? –

回答

2

當你說;(#,##0.00){0:;(}。該值已經四捨五入爲0.因此,它不會得到您期望的結果。

所以最好是檢查就簽收之前,它是消極的。

var value = -0.001M; 
string decimalFormat = value > 0 ? "{0:#,##0.00}" : "({0:#,##0.00})"; 
Console.WriteLine(String.Format(decimalFormat, value)); 

基於符號應該做的字符串格式之間進行選擇。

+1

是的,這可以在你指定的代碼中工作。不幸的是我的用途是在WPF XAML文件中,所以我不能像你所說的那樣應用邏輯 - 我只有字符串格式字符串可以使用。我仍然不清楚爲什麼{0:(}令牌拿起從完全獨立的四捨五入設置{0:#,## 0.00;#,## 0.00}列要麼... –

+0

如果您正在使用MVVM模式,這將不會是一個問題,你應該能夠把它綁定到可以修改視圖的屬性getter格式我可能最終不得不做這樣的屬性Model – CarbineCoder

+2

。我不相信這樣的邏輯應該是在視圖模型上 - 這實際上是一個演示文稿的事情(我也用紅色顯示負值,用於演示目的)另一種選擇是編寫一個轉換器類;儘管失去了字符串格式的簡單性是一種遺憾! –