【问题标题】:Parsing numbers from different cultures in C#在 C# 中解析来自不同文化的数字
【发布时间】:2012-01-18 11:24:24
【问题描述】:

我正在编写一些代码来将字符串解析为双精度,但是这个字符串是从另一台机器传递给我的。自然会出现文化不同的问题。所以,虽然机器 A 可能会发送给我:

"0.5"

机器 B 可能会发给我

"0,6"

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

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

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

【问题讨论】:

  • 这不是因为它在德国,而是因为程序员对这个问题一无所知 - 遗憾的是太常见了。所有外部沟通都应该在不变的文化中。当您执行 String.Format 时,FxCop 甚至会在 .NET 中发出警告。
  • 谢谢,有道理。我现在更好地理解了不变文化的使用。

标签: c# culture


【解决方案1】:

如果您知道源文化,并且可以获得代表它的CultureInfo 实例,则可以将其作为参数传递给Convert.ToDoubleDouble.Parse 方法。例如,如果您从(已知)德国用户那里获得此信息:

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

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

【讨论】:

    【解决方案2】:

    发送这个是机器还是人?如果它是一台机器——也就是说,另一台机器上有一个应用程序决定发送什么数据,而不是“盲目”传输用户输入,那么应该指定这些东西的格式而不是依赖于语言环境。一般来说,这意味着你们双方都同意使用 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

    【讨论】:

    • 谢谢,这是我理解问题所需的背景,现在我正确理解了人们为什么使用不变文化。
    • 是的,InvariantCulture 根本不是一种文化。它用于以故意隐藏文化差异的方式执行相同类型的操作(将数字显示为字符串等),因为它只涉及机器。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      最好的情况是发送者和接收者总是使用相同的文化来传输数据。在您当前的情况下:即使是德国机器也应该发送“0.5”。

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

      如果您不控制源,剩下的唯一选择是尝试检测文化,调整您的解析,并希望它有效。不过,预计它会一直是错误的来源。


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

      【讨论】:

      • 感谢有关保持发件人/收件人之间的文化相同的背景。
      猜你喜欢
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2022-07-24
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      相关资源
      最近更新 更多