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

Michael Stum 59 .net c# asp.net globalization internationalization

多文化编程的一个有趣部分是数字格式.

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

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

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

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

.net Framework是否包含一些神秘的黑魔法浮点解析器,比Double.(Try)Parse()尝试自动检测数字格式更好?

huseyint.. 27

我不知道问题的ASP.NET方面,但.NET有一个非常强大的类:System.Globalization.CultureInfo.您可以使用以下代码来解析包含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,这些都可以正常工作.


Ryan Fox.. 27

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


Chris Marast.. 12

你无法取悦所有人.如果我输入10作为10.000,有人输入10,000作为10.000,如果没有对输入文化的一些了解,你就无法处理.以某种方式检测文化(浏览器,系统设置 - 用例是什么?ASP?内部应用程序,或向世界开放?),或提供预期格式的示例,并使用最宽松的解析器.可能是这样的:

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


Michiel de M.. 10

12.345法语和英语之间的差异是1000倍.如果你提供的最大值<1000*min的预期范围,你可以轻松猜测.

以mm为例(包括婴儿和儿童)的身高.

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