Floating Point Number parsing: Is there a Catch All algorithm?数字文化是多元文化编程中有趣的部分之一。
我的第一种方法是获取字符串,向后解析它,直到遇到分隔符并将其用作我的十进制分隔符。有一个明显的缺陷:10.000将被解释为10。 另一种方法:如果字符串包含2个不同的非数字字符,则使用最后一个作为小数点分隔符,并丢弃其他字符。如果我只有一个,请检查是否出现了一次以上,并丢弃。如果仅出现一次,请检查其后是否有3位数。如果是,则将其丢弃,否则,将其用作小数点分隔符。 显而易见的"最佳解决方案"是检测用户的区域性或浏览器,但是如果您有法国人使用英语(美国)Windows /浏览器,则此方法不起作用。
.net Framework是否包含一些神话般的黑魔法浮点解析器,它们在尝试自动检测数字格式方面优于 我认为在这种情况下,您能做的最好的事情就是接受他们的意见,然后向他们展示您的想法。如果他们不同意,请向他们显示您期望的格式,然后让他们再次输入。 我不知道问题的ASP.NET方面,但是.NET具有一个非常强大的类:System.Globalization.CultureInfo。您可以使用以下代码来解析包含双精度值的字符串:
如果ASP.NET以某种方式(即使用HTTP请求标头)将当前用户的CultureInfo传递给CultureInfo.CurrentCulture或CultureInfo.CurrentUICulture,则它们将正常工作。 你不能取悦所有人。如果我输入10作为10.000,而有人输入一万作为10.000,则在不了解输入文化的情况下,您将无法处理该输入。以某种方式检测文化(浏览器,系统设置-用例是什么?ASP?内部应用程序,还是向世界开放?),或者提供预期格式的示例,并使用最宽松的解析器。大概是这样的:
法语和英语之间的12.345之差为1000的因数。如果您提供的期望范围最大为<1000 * min,则可以轻松猜测。 以一个人(包括婴儿和儿童)的身高为单位。 通过使用200-3000的范围,输入1.800或1800可以明确地解释为1米和80厘米,而输入912.300或912,300可以明确地解释为91厘米和2.3毫米。 |