将数字格式化为字符串,使用逗号代替小数

时间:2009-10-13 09:45:00

标签: c# .net formatting globalization numbers

我有以下号码:4.3

对于我们的一些欧洲朋友,我想将此号码显示为4,3

我的印象是以下行可以解决问题:

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

我使用的是不正确的字符串吗?

9 个答案:

答案 0 :(得分:31)

我想:

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

应该做你想做的事。

答案 1 :(得分:31)

NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ",";
nfi.NumberGroupSeparator = ".";

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

答案 2 :(得分:11)

这取决于你想做什么。如果您想让整个应用程序为其他语言输出做好准备,请使用

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);

如果可行的话,首选方法是首选方法,因为您的应用程序中只需要一行,并且所有内容都符合预期。在第二步中,您必须将culture参数添加到整个应用程序中的每个String输出方法。

答案 3 :(得分:3)

对于更通用的解决方案,您可以set the thread's UI culture了解您的欧洲朋友所使用的文化。这将影响数字,货币,日期等的表示。

答案 4 :(得分:2)

默认情况下,数字格式使用当前NumberFormatInfo中的CultureInfo,以便使用计算机上的区域设置进行显示。

因此,除了确保正在使用正确的CultureInfo之外,你真的不需要做任何特别的事情。

至于问题,是字符串无效。 “,”表示千位分隔符,而不是小数分隔符。看看NumberFormatInfo和custom number formats

答案 5 :(得分:1)

使用带逗号而不是小数点的CultureInfo(例如法语):

string.Format(CultureInfo.GetCultureInfo("fr-FR"), "{0:0.0}", 4.3);

答案 6 :(得分:1)

是的,你使用了错误的字符串,而且只提供格式化字符串也无法解决问题。

格式化字符串的作用是使用模式"0"格式化数字,然后将其与长度0对齐。

在格式化字符串中指定小数点分隔符时,无论当前文化如何,它始终都是句点。另一方面,格式化结果中的小数分隔符始终是当前文化使用的分隔符。因此,要在结果中将逗号作为小数分隔符,您必须确保用于格式化的文化是使用逗号作为小数分隔符的文化。

您可以为线程设置当前区域性,以便默认情况下使用格式,或者在调用中指定区域性:

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

答案 7 :(得分: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;

答案 8 :(得分: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(再一次,逗号是法语中的小数分隔符,并且线程的文化也设置为法语,因此它使用这种文化显示 - 因此逗号作为输出中的小数分隔符。)