c# -浮点数解析:是否有一个全部捕获算法?

Translate

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

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

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

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

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

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

This question and all comments follow the "Attribution Required."

所有的回答

Translate

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

来源
Translate

我不知道问题的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,则它们将正常工作。

来源
Translate

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

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

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

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

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

来源