繁体   English   中英

在 C# 中使用 RegEx 验证浮点数

[英]Validate float number using RegEx in C#

我正在尝试在 WPF 中制作仅数字TextBox ,并且我有以下代码:

void NumericTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    e.Handled = !IsValidInput(e.Text);
}

private bool IsValidInput(string p)
{
    switch (this.Type)
    {
        case NumericTextBoxType.Float:
            return Regex.Match(p, "^[0-9]*[.][0-9]*$").Success;
        case NumericTextBoxType.Integer:                    
        default:
            return Regex.Match(p, "^[0-9]*$").Success;                    
    }
}

// And also this!
public enum NumericTextBoxType
{
    Integer = 0, 
    Float = 1
}

当我将类型设置为 Integer 时,它运行良好,但对于 Float,则不行。

我可以使用这么多的NumericTextBox控件,但我想知道为什么这个控件不起作用?

试试这个:

@"^[0-9]*(?:\.[0-9]*)?$"

你需要逃离这个时期。 使句点和小数部分可选可能是一个好主意。

如果您需要处理负值,您可以添加-? 在每个模式中的第一个[0-9]之前。

更新

测试如下:

var regex = new Regex(@"^[0-9]*(?:\.[0-9]*)?$");
Console.WriteLine(new bool[] {regex.IsMatch("blah"),
                              regex.IsMatch("12"),
                              regex.IsMatch(".3"),
                              regex.IsMatch("12.3"),
                              regex.IsMatch("12.3.4")});

结果是

False 
True 
True 
True 
False 

我敦促您使用Double.TryParse()方法而不是正则表达式验证。 使用TryParse()让您的应用程序在文化方面更加通用。 当前文化发生变化时, TryParse()将毫无问题地进行解析。 TryParse()方法也被认为没有错误,因为它们已经过 .net 社区的测试。

但是在正则表达式的情况下,您应该更改验证表达式,因此它可能与新文化无关。

您可以像这样重写代码:

private bool IsValidInput(string p)
{
    switch (this.Type)
    {
        case NumericTextBoxType.Float:
            double doubleResult;
            return double.TryParse(p, out doubleResult);
        case NumericTextBoxType.Integer:                    
        default:
            int intResult;
            return int.TryParse(p, out intResult);
    }
}

您甚至可以添加自己的扩展方法,使解析部分更加优雅。

public static double? TryParseInt(this string source)
{
    double result;
    return double.TryParse(source, out result) ? result : (double?)null;
}

// usage
bool ok = source.TryParseInt().HasValue;

查看您将在 double、float 和 int 上找到的TryParse静态方法。

如果可以解析字符串(通过Parse方法),则它们返回 true。

[-+]?\\d+(.\\d+)?

最简单的浮动正则表达式。 它与案例“123”不匹配。 或“.123”。

此外,您应该查看上下文文化:

CultureInfo ci = CultureInfo.CurrentCulture;
var decimalSeparator = ci.NumberFormat.NumberDecimalSeparator;
var floatRegex = string.Format(@"[-+]?\d+({0}\d+)?", decimalSeparator);

我尝试了上面批准的解决方案,发现如果用户只输入一个点@"^[0-9]*(?:\\.[0-9]*)?$"就会失败。

所以,我将其修改为:

@"^[0-9]*(?:\.[0-9]+)?$"

这是我通过混合@Andrew Cooper 和@Ramesh 的回复得出的代码。 添加了字典代码,因此任何想测试代码的机构都可以以简单的方式运行尽可能多的测试用例。

//greater than or equal to zero floating point numbers
Regex floating = new Regex(@"^[0-9]*(?:\.[0-9]+)?$");
        Dictionary<string, bool> test_cases = new Dictionary<string, bool>();
        test_cases.Add("a", floating.IsMatch("a"));
        test_cases.Add("a.3", floating.IsMatch("a.3"));
        test_cases.Add("0", floating.IsMatch("0"));
        test_cases.Add("-0", floating.IsMatch("-0"));
        test_cases.Add("-1", floating.IsMatch("-1"));
        test_cases.Add("0.1", floating.IsMatch("0.1"));
        test_cases.Add("0.ab", floating.IsMatch("0.ab"));

        test_cases.Add("12", floating.IsMatch("12"));
        test_cases.Add(".3", floating.IsMatch(".3"));
        test_cases.Add("12.3", floating.IsMatch("12.3"));
        test_cases.Add("12.3.4", floating.IsMatch("12.3.4"));
        test_cases.Add(".", floating.IsMatch("."));

        test_cases.Add("0.3", floating.IsMatch("0.3"));
        test_cases.Add("12.31252563", floating.IsMatch("12.31252563"));
        test_cases.Add("-12.31252563", floating.IsMatch("-12.31252563"));

        foreach (KeyValuePair<string, bool> pair in test_cases)
        {
            Console.WriteLine(pair.Key.ToString() + "  -  " + pair.Value);
        }

暂无
暂无

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

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