在C#中解析来自不同文化的数字
我正在编写一些代码来将字符串解析为double,但是这个字符串是从另一台机器传递给我的。 当然,在文化可能不同的地方出现了问题。 所以,机器A可能会发送给我:
"0.5"
机器B可能会发给我
"0,6"
因为它在德国并且有着不同的文化。
正确解析这两个输入的最佳方法是什么? 有人建议使用CultureInfo.InvariantCulture
作为Convert.ToDouble
的参数,但这不会只对我生产上述字符串的地方有帮助,而不是当别人可以发给我不同的字符串时?
我是否正确地认为我需要知道源文化并在尝试转换之前更改Thread.CurrentThread.CurrentCulture
以匹配?
它是一台机器还是一个人发送这个? 如果它是一台机器 – 也就是说,在另一台机器上有一个应用程序决定要发送什么数据,而不是用户输入的“盲”传输,那么应该指定这些事物的格式而不是与语言环境相关的格式。 通常,这意味着您同意使用CultureInfo.InvariantCulture
或与其他应用程序不是.NET相同的文化。
如果它是一个人,你知道他们的语言环境,那么你可以使用double.Parse(decString, cultureInfo)
。 如果例如一些讲英语的人借用他们讲德语的朋友的电脑,这可能会失败。
如果你知道不会有任何分组分隔符(例如123,456.78或123’457,78)那么你可以使用double.Parse(decString.Replace(',', '.'), CultureInfo.InvariantCulture)
但不能如果有分组,则意味着123,456.78
变为123.456.78
。
如果您知道源文化,并且可以获得表示它的CultureInfo
实例,则可以将其作为参数传递给Convert.ToDouble
或Double.Parse
方法。 例如,如果你有一个(已知的)德国用户:
var cultureInfo = CultureInfo.GetCultureInfo("de-DE"); double result = Double.Parse("0,5", cultureInfo);
如果您不确定,但源文化范围有限,那么您可以使用不同文化的Double.TryParse
尝试。 但是,正如下面所指出的,“1000”可能具有完全不同的含义,具体取决于文化……
是的,要可靠地解析数字,您需要了解源文化。
最好的情况是发送方和接收方始终使用相同的Culture来传输数据。 在您目前的情况下:即使是德国机器也应发送“0.5”。
理论上的下一个最好的事情是调整接收器的设置以符合发送者的设置。 虽然在实践中这比前一种情况更难:如果没有发送者合作,就不可能准确地识别文化。 当你可以让发件人合作时,你最好强迫它发送你想要的文化。 所以你在实践中几乎没有看到这一点。
如果你不控制源,唯一的选择是尝试检测文化,调整你的解析,并希望它的工作原理。 但是,预计它将成为持续存在的错误来源。
因此,最好的办法是确定文化(通常是InvariantCulture
)并调整发件人。 从长远来看,你会更好。