关于c#:浮点数解析:是否有“全部捕获”算法?

关于c#:浮点数解析:是否有“全部捕获”算法?

Floating Point Number parsing: Is there a Catch All algorithm?

数字文化是多元文化编程中有趣的部分之一。

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

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

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

显而易见的"最佳解决方案"是检测用户的区域性或浏览器,但是如果您有法国人使用英语(美国)Windows /浏览器,则此方法不起作用。

.net Framework是否包含一些神话般的黑魔法浮点解析器,它们在尝试自动检测数字格式方面优于Double.(Try)Parse()


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


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

1
2
3
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,则它们将正常工作。


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

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

法语和英语之间的12.345之差为1000的因数。如果您提供的期望范围最大为<1000 * min,则可以轻松猜测。

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

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


推荐阅读