【问题标题】:Parsing doubles in an unknown locale in C#在 C# 的未知语言环境中解析双精度数
【发布时间】:2012-11-05 21:57:21
【问题描述】:

我正在编写一个程序,需要解析一些第三方软件生成的一堆文本文件。其中一些文件将在法国生成,其中“1,5”之类的意思是“一个半”。其他文件将在美国生成,其中“1,5”不是数字,“一个半”是“1.5”。当然,“1,234.5”在美国是合法的数字。

这些只是示例;实际上,我的程序需要处理各种语言环境中的各种数字;它需要处理诸如“e-5”和“2e10”之类的事情。不幸的是,没有办法提前知道哪个文件来自哪个语言环境。

在 C# 中是否有一些普遍接受的解决方案来解决这个问题?我意识到我可以编写自己的数字解析代码,但我宁愿避免它,除非没有其他办法......

【问题讨论】:

  • 试错?!你可以看看你想到哪里的问题,并使用double.TryParse行(等)。然后您(希望)知道它是哪种文化,您可以开始使用正确的文化解析该文件。
  • 如果您不知道字符串的格式,您将无法正确解释它。您将如何确定您自己的数字解析代码中的格式?
  • 没有任何限制,你能做的最好的就是一堆启发式方法——这将是非常手动的。
  • 如何使用可能的语言环境列表来遍历并用于TryParseing?
  • 如果在任何地方都使用相同的第三方软件,请与供应商讨论是否需要具有全球一致的导出格式。这就是支持合同的用途。

标签: c# parsing internationalization double


【解决方案1】:

由于您的整个输入文件都是从一个语言环境生成的,因此您可以将问题视为在实际解析输入文件之前必须从输入文件中检测特定语言环境。这是由于输入文件不足而导致的额外要求(它们都应该使用一个约定的语言环境或有一个字段来指定使用的语言环境)。

语言检测不是一个完整的解决方案,因为数字格式不是特定于语言而是特定于区域设置。这是一个示例:如果您检测到语言是西班牙语,那是 es-ES(西班牙)还是 es-MX(墨西哥)?在前一种情况下,小数点分隔符是逗号 (1,23)。在后者中,小数分隔符是句点 (1.23)。

解决方案将基于启发式。最简单的可能是,如果您知道您的语言环境通常是什么(例如,您的大多数用户使用句点),您可以拥有一个有序的文化标识符列表,然后一个接一个地尝试,直到找到可以使用的一个解释文件中的所有数字。可以像从 en-US 开始一样简单,如果失败了,尝试使用 en-GB,因为对于数字,真的没有更多的格式。

【讨论】:

  • 这是我最终采用的解决方案;您对特定于语言环境的格式化是绝对正确的。我当然希望我们可以让所有输入文件使用相同的语言环境,我正在努力实现它,但遗憾的是,我不是管理该系统的人......
  • 忘了提一下:如果您最终能够授权一种文化,那么最适合数据交换(从不按原样显示给用户)可能是不变的文化。
【解决方案2】:

这可能是一个设计过度的解决方案,但它可以工作(如果您的文本文件包含除数字之外的一些文本):

  1. 使用letter frequency 检测文本文件的语言。谷歌已经开源了他们在 Chrome 中用于检测页面语言的代码 - http://code.google.com/p/chromium-compact-language-detector/。我想我看到了 C# 包装器,但我现在找不到它。如果您不想使用任何库,那么自己实现它并不难。我对该算法进行了一些非常简单的测试,似乎可以从大约 15-20 个字母中检测出一种语言。
  2. 根据检测到的语言规则构建正则表达式(或仅对其进行解析)。考虑到小数分隔符、数字分组、负号等有很多规则,这可能是一个非常复杂的问题。但并非不可能实现。

【讨论】:

  • 问题是数字格式取决于语言环境,而不是语言。因此,如果您将语言检测为英语,您仍然不知道是选择 en-US 还是 en-GB。碰巧的是,en-US 和 en-GB 具有相同的数字格式规则,但这只是运气(例如,它们具有不同的日期格式规则)。
【解决方案3】:

正如您从 cmets 中看到的,您的问题没有故障安全解决方案。 你能做的最好的就是尽量减少错误:

由于每个文件(希望)都包含来自同一语言环境的多个数字,请尝试使用所有预期的 distinct 语言环境解析文件中的数字(即不要使用 en-US 和 en-例如 AU,因为两种语言环境的数字格式是相同的。)

解析后,您将得到以下任一结果:

  1. 一个匹配的语言环境。
  2. 多个语言环境。

在第二种情况下,测试所有语言环境的结果是否匹配(大多数/所有语言环境都以相同的方式解析没有千位分隔符的整数和科学记数法。)

如果它们匹配没有问题,则尝试使用启发式方法找出正确的语言环境:

  • 这些值是否在预期范围内。
  • 如果文件中有任何其他文本,您可以在语言词典中进行单词搜索以尝试找出语言。

如果一切都失败了,请丢弃该文件并将其标记为手动处理。 您的程序应该具有允许绕过启发式将文件标记为特定文化的工具。

您最好的选择是更改输入格式,以便在某处指定文件区域设置,例如在数据、文件名或随附的元数据文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2014-04-26
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多