浮点数parsing:是否有一个Catch Allalgorithm?

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

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

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

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

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

.net框架是否包含一些神奇的黑魔法浮点parsing器,比Double.(Try)Parse()在尝试自动检测数字格式方面更好?

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

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

 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.000input十,而有人以10,000input一万,那么在不了解input文化的情况下就无法处理。 以某种方式检测文化(浏览器,系统设置 – ASP的用法是什么?内部应用程序,还是向世界开放?),或提供预期格式化的例子,并使用最宽松的parsing器。 可能是这样的:

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

法语和英语的12.345之间的差异是1000的因数。如果您提供了最大值<1000 * min的预期范围,则可以轻松地进行猜测。

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

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