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

15

我有一个数字:4.3

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

我曾以为以下代码可以解决问题:

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

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

9个回答

34

我认为:

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

应该做到你想要的。


3
我会照顾好处理成千上万的事物,这些事情也是以不同的方式完成的。 - dove
5
但它的缺点是你必须在代码中每个ToString、String.Format、Number.Parse等方法中手动插入文化信息。 - Foxfire
它对于特定情况有帮助,但不允许指定小数点。 - Léon Pelletier

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

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

1
@James:除非你想重新发明轮子,否则这种方法没什么用处,因为.NET已经内置了文化支持。最好按照支持的方式来做。 - Mats Fredriksson
2
@Mats:如果您决定选择任意欧洲的CultureInfo对象(例如,“de-DE”或“fr-FR”),并且该文化已经定制为使用不同的小数分隔符,那会发生什么?我知道这是一个不太可能的情况,但它确实可能发生。使用我的代码,您将始终获得,作为小数分隔符,而不考虑任何自定义。 - LukeH
但是您不希望始终获得 ,,您希望根据用户的区域设置(包括他/她的自定义设置)格式化字符串。 - vgru
6
@Groo:这不是问题所说的。它明确指出“将此数字显示为4.3”,而不是“根据用户的区域设置(包括他/她的自定义设置)显示此数字”。 - LukeH
1
@luke:它说:“将这个数字显示为4.3,以便我们的一些欧洲朋友能够理解”。我会解释为“根据最终用户的语言环境显示值”,但我可能理解有误。如果他想根据最终用户的文化来显示,则应使用该文化。不是随意选择的,而是最终用户的文化。 - Mats Fredriksson

13

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

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

如果可能的话,推荐使用第一种方法,因为你只需要在应用程序中添加一个单行代码,就可以得到预期的结果。而在第二种方法中,你需要在整个应用程序中的每个字符串输出方法中添加区域参数。


这是一个很好的答案。你知道是否可以通过配置文件进行设置吗? - Greg
@Greg 我认为在ASP.NET中有全球化部分,但不在WinForms和控制台应用程序中。 - Kiquenet

3

如果需要更一般性的解决方案,您可以设置线程的 UI 文化为您的欧洲朋友所使用的文化。这将影响数字、货币、日期等的呈现方式。


2
默认情况下,数字格式化使用当前区域设置(CultureInfo)中的NumberFormatInfo,因此它会使用计算机上的区域设置进行显示。
因此,您实际上不需要做任何特别的事情,只需确保使用了正确的CultureInfo即可。
至于问题,是的,该字符串无效。 “,”表示千位分隔符,而不是小数点分隔符。请查看NumberFormatInfo和自定义数字格式

1

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

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

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

如果您想进行“一次性”显示,第二种方法将起作用。如果您想正确地显示每个数字,您真的应该设置当前线程的文化。这样,任何数字操作都将正确处理小数分隔符、分组字符和任何其他特定于文化的事物。
解析数字也是如此。如果用户输入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(同样,逗号是法语中的小数分隔符,并且线程的文化设置为法语,因此在输出中使用逗号作为小数分隔符)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接