浮点数解析: 是否存在“全捕获”算法?

多文化编程的一个有趣的部分是数字格式。

  • 美国人用10000.5美元
  • 德国人用一万,五万
  • 法国人用一万,五万

我的第一个方法是获取字符串,向后解析它,直到遇到一个分隔符,然后使用它作为我的小数点。这里有一个明显的缺陷: 10.000将被解读为10。

另一种方法是: 如果字符串包含2个不同的非数字字符,使用最后一个作为小数点,并丢弃其他字符。如果我只有一个,检查它是否发生了不止一次,如果发生了就丢弃它。如果它只出现一次,检查它后面是否有3个数字。如果是,丢弃它,否则,把它当作小数点。

显而易见的“最佳解决方案”是检测用户的文化或浏览器,但是如果你有一个法国人使用一个 en-US Windows/Browser,这是行不通的。

是不是。Net 框架包含一些神秘的黑魔法浮点解析器,这是比 Double.(Try)Parse()更好的尝试自动检测的数字格式?

3513 次浏览

我不知道问题的 ASP.NET 方面,但是。NET 有一个非常强大的类: 系统。全球化。文化信息。可以使用下面的代码来分析包含双精度值的字符串:

double d = double.Parse("100.20", CultureInfo.CurrentCulture);
//  -- OR --
double d = double.Parse("100.20", CultureInfo.CurrentUICulture);

如果 ASP.NET 以某种方式(即使用 HTTP 请求头)将当前用户的 CultureInfo 传递给 CultureInfo。当前文化或文化信息。CurrentUICulture,这些将工作得很好。

你不可能取悦所有人。如果我输入10作为10.000,而有人输入10000作为10.000,那么如果不了解输入的文化,就无法处理这个问题。以某种方式检测区域性(浏览器,系统设置-用例是什么?ASP?内部应用程序,还是向世界开放?)或提供所需格式的示例,并尽可能使用最宽松的解析器。可能是这样的:

double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);

我认为在这种情况下,你能做的最好的就是接受他们的意见,然后向他们展示你认为他们是什么意思。如果他们不同意,向他们展示你期望的格式,让他们再次输入。

法语和英语的12.345之间的差异是1000倍。如果您提供了一个最大值 < 1000 * min 的预期范围,则可以很容易地猜测。

以毫米为单位的人(包括婴儿和儿童)的身高为例。

使用200-3000的范围,1.800或1.800的输入可以明确地解释为1米和80厘米,而912.300或912.300的输入可以明确地解释为91厘米和2.3毫米。