在C#中解析来自不同文化的数字

时间:2012-01-18 11:24:24

标签: c# culture

我正在编写一些代码来将字符串解析为double,但是这个字符串是从另一台机器传递给我的。当然,文化可能会有所不同。所以,机器A可能会发送给我:

"0.5"

机器B可能会发给我

"0,6"

因为它在德国并且有不同的文化。

正确解析这两个输入的最佳方法是什么?有人建议使用CultureInfo.InvariantCulture作为Convert.ToDouble的参数,但这不会只对生成上述字符串的情况有帮助,而不是当其他人可以向我发送不同的字符串时?

我是否正确地认为我需要了解源文化并在尝试转换之前更改Thread.CurrentThread.CurrentCulture以匹配?

4 个答案:

答案 0 :(得分:3)

如果您了解源文化,并且可以获得代表它的CultureInfo实例,则可以将其作为参数传递给Convert.ToDoubleDouble.Parse方法。例如,如果你有一个(已知的)德国用户:

var cultureInfo = CultureInfo.GetCultureInfo("de-DE");
double result = Double.Parse("0,5", cultureInfo);

如果您不确定,但源文化范围有限,那么您可以尝试使用不同文化的Double.TryParse次尝试。但是,正如下文所指出的,“1,000”可能具有完全不同的含义,具体取决于文化......

答案 1 :(得分:2)

是的,要可靠地解析数字,您需要了解源文化。

答案 2 :(得分:1)

是机器还是发送此功能的人?如果它是一台机器 - 也就是说,在另一台机器上有一个应用程序决定要发送什么数据,而不是用户输入的“盲”传输,那么应该指定这类事物的格式而不是与语言环境相关的格式。通常,这意味着如果其他应用程序不是.NET,则您同意使用CultureInfo.InvariantCulture或等效的文化。

如果是某人并且您知道他们的语言环境,那么您可以使用double.Parse(decString, cultureInfo)。如果某些讲英语的人借用他们讲德语的朋友的电脑,这可能会失败。

如果您知道不会有任何分组分隔符(例如123,456.78或123'457,78),那么您可以使用double.Parse(decString.Replace(',', '.'), CultureInfo.InvariantCulture)但是如果有分组则不能,因为这意味着123,456.78变为{ {1}}。

答案 3 :(得分:0)

最好的情况是发送方和接收方始终使用相同的Culture来传输数据。在您目前的情况下:即使是德国机器也应该发送" 0.5"。

理论上的下一个最好的事情是调整接收器的设置以符合发送者的设置。虽然在实践中这比前一种情况更难:如果没有发送者的合作,就不可能准确地识别文化。当你可以让发件人合作时,你最好强迫它发送你想要的文化。所以你在实践中几乎没有看到这一点。

如果你不控制源,唯一的选择是尝试检测文化,调整你的解析,并希望它的工作原理。不过,期待它成为持续存在的错误来源。


所以最好的办法是确定一种文化(通常是InvariantCulture)并调整发件人。从长远来看,你会更好。