浮点数解析:是否有"全部捕获"算法?

时间:2020-03-05 18:37:18  来源:igfitidea点击:

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

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

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

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

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

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

解决方案:

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

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?内部应用程序,还是向世界开放?),或者提供预期格式的示例,并使用最宽松的解析器。大概是这样的:

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毫米。