浮点数解析:有 Catch All 算法吗?
-
08-06-2019 - |
题
多元文化编程的有趣部分之一是数字格式。
- 美国人使用 10,000.50
- 德国人使用 10.000,50
- 法国使用 10 000,50
我的第一种方法是获取字符串,向后解析它,直到遇到分隔符并将其用作小数点分隔符。这有一个明显的缺陷:10.000 将被解释为 10。
另一种方法:如果字符串包含 2 个不同的非数字字符,则使用最后一个作为小数分隔符并丢弃其他字符。如果我只有一个,请检查它是否出现多次,如果出现则将其丢弃。如果只出现一次,检查后面是否有3位数字。如果是,则丢弃它,否则,将其用作小数点分隔符。
明显的“最佳解决方案”是检测用户的文化或浏览器,但如果您有一个使用美国 Windows/浏览器的法国人,则此方法不起作用。
.net Framework 是否包含一些神秘的黑魔法浮点解析器,它比 Double.(Try)Parse()
试图自动检测数字格式?
解决方案
我认为在这种情况下你能做的最好的事情就是听取他们的意见,然后向他们展示你认为他们的意思。如果他们不同意,请向他们展示您期望的格式并让他们再次输入。
其他提示
我不知道 ASP.NET 方面的问题,但 .NET 有一个非常强大的类: 系统.全球化.文化信息. 。您可以使用以下代码来解析包含 double 值的字符串:
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,如果不了解输入的文化,您将无法处理该问题。以某种方式检测文化(浏览器、系统设置 - 用例是什么?应用服务提供商?内部应用程序,还是向世界开放?),或者提供预期格式的示例,并尽可能使用最宽松的解析器。大概是这样的:
double d = Double.Parse("5,000.00", NumberStyles.Any, CultureInfo.InvariantCulture);
法语和英语的 12.345 相差 1000 倍。如果您提供 max < 1000*min 的预期范围,您可以轻松猜测。
以人(包括婴儿和儿童)的身高(以毫米为单位)为例。
通过使用 200-3000 的范围,输入 1.800 或 1,800 可以明确地解释为 1 米和 80 厘米,而输入 912.300 或 912,300 可以明确地解释为 91 厘米和 2.3 毫米。