2011-08-22 119 views
3

我有一個非常緊湊的方式去除十進制值中的尾隨零,但我更喜歡一種不涉及字符串往返的方式,就像我現在所做的那樣。這是我目前的解決方案:標準化一個System.Decimal - 條尾隨零

var value = 0.010m; 
value = decimal.Parse(value.ToString("G29")); 
Console.WriteLine(value); // prints 0.01 (not 0.010) 

所以它的工作,但你有更好的辦法嗎?

此外,第二個問題是decimalValue.ToString()100%符合xs:decimal?

+1

- 當然,我可以重複截斷和比較小數點,直到值不再相等。至少(0.010米== 0.01米) –

+2

相關問題:http://stackoverflow.com/questions/3683718/is-there-a-way-to-get-the-significant-figures-of-a-decimal –

+2

最好的辦法是用Jon的答案來解答同樣的問題:http://stackoverflow.com/questions/4298719/parse-decimal-and-filter-extra-0-on-the-right/4298787#4298787 – Gabe

回答

0

這裏有一個新的想法草案:

public static class DecimalEx 
{ 
    public static decimal Fix(this decimal value) 
    { 
     var x = value; 
     var i = 28; 
     while (i > 0) 
     { 
      var t = decimal.Round(x, i); 
      if (t != x) 
       return x; 
      x = t; 
      i--; 
     } 
     return x; 
    } 
} 

這可能只是做到這一點。但它很粗糙。需要測試和簡化它。

1

要回答第二個問題,System.XmlConvert.ToString(decimal value)與xs:decimal是100%一致的。

這個應該稍快。

public static decimal StripTrailingZeroes(this decimal value) 
{ 
    return decimal.Parse(value.ToString("G29", CultureInfo.InvariantCulture), CultureInfo.InvariantCulture); 
} 
+0

謝謝,我會用它! :-) –

+0

@Bent - 抱歉,我無法解決原始問題 - 我嘗試瞭解Decimal是如何工作的,它的記錄很差,看起來像修改'int [4]'表示法可能會很棘手。我會讓這是一個擴展方法,如果它成爲一個問題,它會在稍後優化它;很有可能它不是一個很大的perf perf(聽起來像是過早的優化)。我已經編輯了我的問題,應該是什麼,最快的字符串往返。 –

+2

這只是「我腦海中的碎片」問題:它不應該改變表示形式爲字符串去掉尾隨的零,所以它讓我難堪,但是你很正確,它應該是正確的,這是最重要的。 –

2

它並不真正的問題多少SF數存儲爲,但是當你輸出它,而會發生什麼。

嘗試

// The number of #'s is the number of decimal places you want to display 
Console.WriteLine(value.ToString("0.###############"); 
// Prints 0.01