浮点数解析:是否有Catch All算法?

数字格式是多文化节目中有趣的部分之一。

  • 美国人使用10,000.50
  • 德国人使用10.000,50
  • 法语使用10 000,50

我的第一种方法是取出字符串,向后解析,直到遇到分隔符并将其用作我的小数分隔符。有一个明显的缺陷:10.000将被解释为10。

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

显而易见的“最佳解决方案”是检测用户的文化或浏览器,但如果您的法国人使用en-US Windows /浏览器,则这种方法无效。

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

0
额外 编辑
意见: 1

4 答案

我不知道问题的ASP.NET方面,但.NET有一个非常强大的类: System.Globalization.CultureInfo 。您可以使用下面的代码来解析包含double值的字符串:

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

如果ASP.NET以某种方式(即使用HTTP请求标头)将当前用户的CultureInfo传递给CultureInfo.CurrentCulture或CultureInfo.CurrentUICulture,这些都可以正常工作。

0
额外

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

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

The difference between 12.345 in French and English is a factor of 1000. If you supply an expected range where max < 1000*min, you can easily guess.

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

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

0
额外

我认为在这种情况下你可以做的最好的是接受他们的意见,然后向他们展示你认为他们的意思。如果他们不同意,请向他们展示您期待的格式,并让他们再次输入。

0
额外