簡體   English   中英

String.Format具有無限精度和至少2個十進制數字

[英]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,找到很多關於這個問題的( 12 ,依此類推)。

這些問題讓我擔心唯一的解決方案就是這個問題: #,##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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM