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

我有以下号码: 4.3

对于我们的一些欧洲朋友,我想将这个数字显示为4,3

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

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

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

我认为:

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

应该做你想做的事。

 NumberFormatInfo nfi = new NumberFormatInfo(); nfi.NumberDecimalSeparator = ","; nfi.NumberGroupSeparator = "."; double num = 4.3; string ret = num.ToString(nfi); // 4,3 

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

 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输出方法。

对于更通用的解决方案,您可以将线程的UI文化设置为您的欧洲朋友使用的文化。 这将影响数字,货币,日期等的表示。

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

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

至于问题,是字符串无效。 “,”表示千位分隔符,而不是小数分隔符。 看看NumberFormatInfo和自定义数字格式 。

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

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

是的,您使用的是错误的字符串,并且仅通过提供格式化字符串也无法解决问题。

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

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

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

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

设置线程文化将自动执行此转换。 但是,如果要使用自定义字符串对其进行格式化,则可以执行以下操作:

 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; 

如果在操作数字时使用正确的区域性 ,框架可以为您处理数字格式。

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

如果您想进行“一次性”显示,第二种方法将起作用。 如果你想正确显示每个数字,你真的应该设置当前线程的文化 。 这样,任何数字操作都将处理小数分隔符,正确分组字符和任何其他特定于文化的内容。

解析数字也是如此。 如果用户输入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 (同样,逗号是法语中的小数分隔符,也是线程的将文化设置为法语,以便使用此文化显示 – 因此逗号作为输出中的小数分隔符)。