2009-09-01 50 views
0

我需要格式化號碼,以便有一個逗號分隔條件上爲任意數量的千位和包括大量如10000 10000變成一個萬元9999 remaains爲9999格式化用逗號

我想使用格式字符串來做到這一點,因爲我不想測試數據以查看它的範圍。

有誰知道如何做到這一點?

回答

8

格式字符串不能表現不同爲不同的值,所以你能做的最好的是:

int n; 

string s = n >= 10000 ? n.ToString("n0") : n.ToString("d"); 

(這將使用用戶的文化,傳遞INumberFormatInfo/CultureInfo如果需要不同的文化)

MSDN:StandardCustom Numeric Format Strings

+1

的OP明確規定他們「不想測試數據以查看它的範圍」。不過,這是最明智的做法,所以+1。 – LukeH 2009-09-01 23:28:58

+1

嗯......我認爲我的解決方案更接近於尊重不需要進行範圍檢查的請求。 – BlueMonkMN 2009-09-02 00:02:25

+2

順便提一下,如果您除以正數,負數和零,您*可以*執行多種格式。看到這裏:http://msdn.microsoft.com/en-us/library/0c899ak8.aspx#SectionSeparator你不能這樣做除了那些部門。 – 2009-09-02 00:14:50

2
num > 9999 ? num.ToString("N0", CultureInfo.InvariantCulture) : num.ToString(); 

「NO」 假設你不想d ecimals。 NFormat

2

我會建議創建自己的IFormatProvider具有快速長度檢查和格式它與千位分隔符正常,如果是五個或更多字符,或無千位分隔符,如果是四個或更少的字符。

您可以輕鬆地修改MSDN docs on IFormatProvider中的示例。

0

必須在某個級別進行範圍檢查。如果實現像這樣,可以嵌入的範圍內的格式框架在一定程度內檢查,繞過默認格式(包括組分隔符)如果所述數目少於5個數字:

class MyFormat : System.IFormatProvider, ICustomFormatter 
{ 
    #region IFormatProvider Members 

    public object GetFormat(Type formatType) 
    { 
     return this; 
    } 

    #endregion 


    #region ICustomFormatter Members 

    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     if (arg is double) 
      if (((double)arg >= 10000) || ((double)arg <= -10000)) 
       return ((double)arg).ToString(format); 
      else 
       return ((double)arg).ToString("R"); 

     if (arg is decimal) 
      if (((decimal)arg >= 10000) || ((decimal)arg <= -10000)) 
       return ((decimal)arg).ToString(format); 
      else 
       return ((decimal)arg).ToString("R"); 

     return arg.ToString(); 
    } 

    #endregion 
} 

class Program 
{ 
    static MyFormat gFormat = new MyFormat(); 

    static void Main(string[] args) 
    { 

     double dblVal1 = 9999, dblVal2 = 123456; 
     Console.WriteLine(String.Format(gFormat, "{0:N0} {1:N0}", dblVal1, dblVal2)); 
    } 
} 
相關問題