繁体   English   中英

浮点数解析:是否有 Catch All 算法?

[英]Floating Point Number parsing: Is there a Catch All algorithm?

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

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

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

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

显而易见的“最佳解决方案”是检测用户的文化或浏览器,但如果您有法国人使用 en-US Windows/浏览器,这将不起作用。

在尝试自动检测数字格式时,.net 框架是否包含一些比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,而有人输入 10000 为 10.000,如果不了解输入的文化,您将无法处理。 以某种方式检测文化(浏览器、系统设置 - 用例是什么?ASP?内部应用程序,还是对世界开放?),或提供预期格式的示例,并使用最宽松的解析器。 大概是这样的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM