2009-10-13 81 views
13

的,我有以下號碼:4.3格式化數字作爲字符串用逗號代替小數

我想顯示該號碼作爲4,3爲我們的一些歐洲朋友。

我的印象是,下面的線會做的伎倆:

string ret = string.Format("{0:0,0}", 4.3); // returns "04", not "4,3" 

我使用了不正確的字符串?

回答

28

我想:

string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE"), "{0:0.0}", 4.3); 

應該做你想要什麼。

+3

也會照顧處理數以千計,這也是不同的。 – dove

+3

但它有缺點,你必須手動插入文化信息在代碼中的每個ToString,String.Format,Number.Parse和類似的方法。 – Foxfire

+0

它有助於特定情況,但不允許指定小數點。 –

2

默認情況下,數字格式使用當前CultureInfo中的NumberFormatInfo,以便它使用計算機上的區域設置進行顯示。

因此,除了可能確保正確使用CultureInfo之外,您並不需要對此做任何特別的處理。

至於問題,是的字符串是無效的。一個「,」表示一個千分隔符,而不是十進制分隔符。看看NumberFormatInfo和custom number formats

3

對於更一般的解決方案,您可以將set the thread's UI culture添加到您的歐洲朋友使用的文化中。這將影響數字,貨幣,日期的演示文稿等

1

使用的CultureInfo有逗號而不是小數點(法語爲例):

string.Format(CultureInfo.GetCultureInfo("fr-FR"), "{0:0.0}", 4.3); 
30
NumberFormatInfo nfi = new NumberFormatInfo(); 
nfi.NumberDecimalSeparator = ","; 
nfi.NumberGroupSeparator = "."; 

double num = 4.3; 
string ret = num.ToString(nfi); // 4,3 
+1

@James:除了文化支持內置於.NET之外,它是無用的。最好以支持的方式來完成,而不是重新創建它。 –

+2

@Mats:如果您決定選擇一個任意的歐洲'CultureInfo'對象(例如「de-DE」或「fr-FR」)並且該文化已經被定製爲使用不同的小數點分隔符會發生什麼?我知道這不太可能,但可能會發生。無論使用什麼定製,使用我的代碼你都會得到一個','作爲小數點分隔符。 – LukeH

+0

但是,您不希望總是按照用戶的區域設置(包括他/她的自定義設置)來格式化字符串。 – Groo

9

這取決於你想要做什麼。如果你想使你的整個應用程序準備好了一些其他語言輸出只使用

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo ("de-DE"); 

如果你想有一個混合語言的應用程序(這意味着一些輸出都在一個語言格式的一些其他)你有使用的特定字符串函數重載,如:

var culture = System.Globalization.CultureInfo.GetCultureInfo("de-DE"); 
String.Format (culture, "{0:0.0}", 4.3); 

第一個方法是首選,如果它是可能的,因爲你只需要在應用程序中單獨一行,一切都會如預期。在第二步中,您必須將文化參數添加到整個應用程序中的每個字符串輸出方法。

+0

這是一個很好的答案。你知道這是否可以通過配置文件設置? – Greg

+0

@Greg ***全球化部分***在ASP.NET中,而不是在WinForms,控制檯應用程序,我想。 – Kiquenet

1

是的,您正在使用錯誤的字符串,並且該問題無法通過僅提供格式化字符串來解決。

格式化字符串的作用是使用模式"0"格式化數字,然後對齊到長度0

當您在格式化字符串中指定小數點分隔符時,無論當前區域性如何,始終是一個句點。另一方面,格式化結果中的小數點分隔符始終是當前文化所使用的小數點分隔符。因此,要在結果中得到逗號作爲小數點分隔符,必須確保用於格式化的文化是使用逗號作爲小數點分隔符的文化。

您可以設置當前文化爲主題,這樣它的使用默認的格式,或在調用中指定一種文化:

string ret = String.Format(CultureInfo.GetCultureInfo(1053), "{0:0.0}", 4.3); 
0

設置線程的文化會自動完成這種轉換。但是,如果你想自定義字符串格式化這個你可以做到以下幾點:

string ret = string.Format("{0:0.00}", 4.3); 

string ret = (4.3f).ToString("0.00"); 

的「」是當前文化的小數點格式說明符。對於自定義數字格式的詳細信息,在發現:http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

您可以隨時檢查是什麼性質的小數點:

string decimalChar = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator; 
0

數字格式可以通過框架,如果你使用正確的爲您處理culture操作數字時。

Console.WriteLine(4.3); 

Console.WriteLine(4.3.ToString(CultureInfo.GetCultureInfo("fr-fr"))); 

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr"); 
Console.WriteLine(4.3); 

如果您想要做「一次性」顯示,第二種方法將工作。如果你想正確顯示每個數字,你應該設置current thread's culture。這樣,任何數字操作都將處理小數分隔符,正確地將字符和其他文化特定的東西分組。

解析數字也是一樣。如果用戶輸入1,234,您如何知道他們是否輸入了1.234(逗號是小數點分隔符)或1234(逗號是分組分隔符)?這是那裏的文化幫助了,因爲它知道如何顯示數字,也可用於正確解析這些:

Console.WriteLine(double.Parse("1,234")); 

Console.WriteLine(double.Parse("1,234", CultureInfo.GetCultureInfo("fr-fr"))); 

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr"); 
Console.WriteLine(double.Parse("1,234")); 

上面會輸出1234(逗號是我小數點分隔EN-US默認文化),1.234(逗號是法語中的小數點分隔符)和1,234(同樣,逗號是法語中的小數點分隔符,並且線程的文化也設置爲法語,因此它使用此文化顯示 - 因此逗號作爲小數點分隔符在輸出中)。