2

我在我的应用程序中发现了一个错误,该错误发生在默认十进制符号是逗号而不是句点的国家/地区的人们身上。C# 中有什么方法可以在不影响其他应用程序或永久更改系统设置的情况下为我的应用程序设置小数点符号?我试过了,但它说 NumberDecimalSeparator 是只读的。

Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator = ".";
4

2 回答 2

3

我仍然需要这样做,您可以像这样更改线程上的 CurrentCulture:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-Us");

选择具有所需小数属性的文化。

var numpre = 1.1.ToString();
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-Us");
var numpost = 1.1.ToString();
numpre.Dump();
numpost.Dump();

输出:

1,1
1.1

于 2013-07-27T17:11:56.733 回答
2

根据具体情况,正确的做法可能不是尝试强制执行格式,而是让您的应用程序了解区域设置并将其考虑在内。这很容易做到,因为 .NET 已经全部实现了(否则将是一场噩梦)。

我想说有两种情况需要处理:当数据可以从一台机器传递到另一台机器时(一些存储的数据、文件、脚本等),以及当它不应该传递时(视觉反馈、值场等)。

当涉及可以从一台机器传递到另一台机器的数据时,您必须选择一种与文化无关的格式。这将保证机器使用相同的格式并以相同的方式解释给定的数据,而不管机器用户设置如何。这就是编程语言所做的,而且似乎是你的情况。

.NET 库CultureInfo.InvariantCulture为此提供:

double x = 0.0;
double.TryParse(source, NumberStyles.Float, CultureInfo.InvariantCulture, out x);
string str = x.ToString(CultureInfo.InvariantCulture);

当涉及本地信息时,您应该使用用户的语言进行读写,使用他的语言环境来解析输入(文本字段)中的数字并在输出中格式化它们。这往往被忽视,但我认为这是非常重要的一点,因为像 1,234.567 这样的数字将根据文化而具有完全不同的含义。例如,请参阅 Microsoft Excel 等软件如何表示并让您根据您的环境设置以不同的方式输入数字。

在这种情况下,上面的代码片段将变为:

double x = 0.0;
double.TryParse(source, NumberStyles.Float, CultureInfo.CurrentUICulture, out x);
string str = x.ToString(CultureInfo.CurrentUICulture);

在 MSDN 文档中查看更多信息:http: //msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx

于 2013-07-27T17:10:00.360 回答