如何禁止逗号作为小数分隔符

时间:2010-09-12 18:26:31

标签: c# .net

我正在用德国文化设置编写代码

尽管如此,我想强制用户将该点用作小数点分隔符。

我的测试代码输出错误的值。

如何检测“错误”逗号?(抛出异常)

string nok_str = "14,9";
string ok_str = "14.9";

double nok_Var1 = double.Parse(nok_str, CultureInfo.InvariantCulture.NumberFormat); // outputs 149.0
double nok_Var2 =Convert.ToDouble(nok_str, CultureInfo.InvariantCulture.NumberFormat); // outputs 149.0

3 个答案:

答案 0 :(得分:3)

首先关闭,请原谅我,我想质疑你的设计决定:

这如何增强用户体验?应用程序应该尝试接受所有明确的用户输入,而不是拒绝理论上的声音输入。

那就是,像“19,2”这样的数字将被解释为具有不变的文化,因为它具有千位分隔符(简单地被丢弃)。这就是您的代码静默生成错误值的原因。如果您想明确禁止此输入,最简单的方法是进行明确的测试:

if (nok_str.Contains(","))
    throw new FormatException(…);

作为替代方法,您可以尝试修改传递给NumberFormatInfo方法的自定义Parse对象的NumberFormatInfo.NumberGroupSeparator属性。

答案 1 :(得分:2)

基本上默认是在数字样式中包含AllowThousands。如果指定所需的数字样式,则可以禁止此操作:

using System;
using System.Globalization;

class Test
{
    static void Main(string[] args)
    {
        string text = "19,2";
        double value;
        bool valid = double.TryParse(text, NumberStyles.Float,
                                     CultureInfo.InvariantCulture,
                                     out value);
        Console.WriteLine(valid); // Prints false
    }
}

请注意,NumberStyles.Float是AllowLeadingWhite,AllowTrailingWhite,AllowLeadingSign,AllowDecimalPoint和AllowExponent的复合样式 - 但不是 AllowThousands。

答案 2 :(得分:0)

我不确定您输入的来源是什么。

如果它来自用户,它还取决于...如果是GUI应用程序,您可能会考虑将输入限制为某些可能的键,不包括逗号。如果它是一个控制台应用程序,您可以尝试使用正则表达式来预验证输入字符串。

如果来自各种来源(即网络服务),可能只是蛮力字符串替换就可以了?

最后,但并非最不重要:有解析文化敏感的原因,如果我是你,我会鼓励用户输入有效的区域数字格式,而不是强迫他们提供不正确的格式。