[英]String.Format with infinite precision and at least 2 decimal digit
我正在為一些非常挑剔數字准確性的人開發一個應用程序(他們正在處理會計和非常准確的電信變量)。 出於這個原因,我到處都使用decimal
類型,因為float和double類型不適合(不要猶豫,將我重定向到現有的更好的數據類型)。
當我需要格式化這些數字時,我的問題出現了。 要求是根據需要顯示盡可能多的十進制數字,但至少為2,並且還要使用組分隔符數千。
例如:
Value Formatted
1 1.00
1000 1,000.00
1.5 1.50
1000.355 1,000.355
0.000035 0.000035
所以我去MSDN尋找數字字符串格式。 我發現這個有用的資源標准數字格式但我的嘗試沒有按預期工作(N,N2,F,F2,G,G2等,即使我不相信它我嘗試了各種組合^^ - 我甚至嘗試一些F2#為了好玩)。
我的結論是沒有內置的格式來做我想做的事情。 對?
所以我查看了下一章Custom Numeric Formats 。 但我找不到適合我需要的組合。 所以我去了SO,找到很多關於這個問題的( 1 , 2 ,依此類推)。
這些問題讓我擔心唯一的解決方案就是這個問題: #,##0.00#######
有盡可能多的尾隨#,因為我需要精度。
我對嗎?
我想12#,我的家伙不會發現任何准確性問題,但我可能錯過了我需要的神奇格式?
這可能是你正在尋找的:
static string FormatNumber(string input)
{
var dec = decimal.Parse(input);
var bits = decimal.GetBits(dec);
var prec = bits[3] >> 16 & 255;
if (prec < 2)
prec = 2;
return dec.ToString("N" + prec);
}
當你調用它時,在小數上執行ToString()
,並在需要時將結果轉換回十進制。
我嘗試了你的示例數字,結果如下:
基於這個SO答案 。
我創建了一個小函數:它根據它具有的小數位數來格式化數字:
public static void Main()
{
decimal theValue;
theValue = 0.000035M;
Console.WriteLine(theFormat(theValue));
theValue = 1.5M;
Console.WriteLine(theFormat(theValue));
theValue = 1;
Console.WriteLine(theFormat(theValue));
}
public static decimal theFormat(decimal theValue){
int count = BitConverter.GetBytes(decimal.GetBits(theValue)[3])[2];
return count > 1?theValue:Convert.ToDecimal(string.Format("{0:F2}", theValue));
}
這樣,產生以下輸出:
0.000035
1.50
1.00
如果您想要完全控制格式化,可以為小數實現自己的IFormatProvider。 在其中你可以使用StringBuilder並做任何你需要的事情,沒有string.Format()的限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.