正则表达式将输入限制为纬度(十进制度数)文本框

时间:2013-12-26 18:21:34

标签: c# regex

我有一个带文本框的WPF应用程序,我的用户将输入十进制度数的纬度值(最多 7位精度)。当然,有效纬度范围为-90.0000000至90.0000000。我正在尝试通过类似于此的文本框的PreviewTextInput事件创建一个正则表达式来限制输入:

    private void latitudeTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        e.Handled = !ValidateDecimalString(e.Text);
    }

    public static bool ValidateDecimalString(string decimalString)
    {
        Regex regex = new Regex("[^0-9]+");
        return !regex.IsMatch(decimalString);
    }

我目前的正则表达式只允许输入数字,但我还需要执行其他一些限制:

  • 纬度可能是负数,所以我需要允许减号(“ - ”),但只有当它显示为第一个字符
  • 纬度只能包含一个小数点(“。”)

有效纬度值的示例:

  • 90
  • 90.0
  • -90.0000000

我可以通过修改我的正则表达式来实现这些额外的限制吗?如果是这样,怎么样?谢谢!

6 个答案:

答案 0 :(得分:1)

尝试这样的事情

public static bool ValidateDecimalString(string decimalString)
{
    Regex regex = new Regex(@"^(-)?([0-9]+)(\.[0-9]+)?$");
    return regex.IsMatch(decimalString);
}

对于验证范围更好地使用转换后的值,如

public static bool ValidateLatitudeString(string decimalString)
{
    if(ValidateDecimalString(decimalString)){
        double lat = 0;
        return double.TryParse(decimalString, out lat) && lat<=90.0 && lat>=-90;
    }
    return false;
}

所以可能更好的是没有正则表达式

public static bool ValidateLatitudeString(string decimalString)
{
    double lat = 0;
    return double.TryParse(decimalString, out lat) && lat<=90.0 && lat>=-90;
}

答案 1 :(得分:1)

这个怎么样?

public static bool ValidateDecimalString(string decimalString)
{
    Regex regex = new Regex("^-?([0-9]|[1-8][0-9]|90)([.][0-9]*)?$");
    return regex.IsMatch(decimalString);
}

这将允许一个可选的前导连字符 - 后跟一个0到90之间的数字(但不是999或01),然后是一个十进制组件。它会允许90.1;禁止这种用法:

public static bool ValidateDecimalString(string decimalString)
{
    Regex regex = new Regex("^-?(([0-9]|[1-8][0-9])([.][0-9]*)?|90([.]0*))$");
    return regex.IsMatch(decimalString);
}

这将允许90.0但不允许90.1

答案 2 :(得分:1)

有很多选择。一种方式 -

 #  @"^-?(?:(?:[0-9]|[1-8][0-9])(?:\.[0-9]{1,7})?|90(?:\.0{1,7})?)$"

 ^ 
 -?
 (?:
      (?:
           [0-9] 
        |  [1-8] [0-9] 
      )
      (?: \. [0-9]{1,7} )?
   |  
      90  
      (?: \. 0{1,7} )?
 )
 $

匹配巨型边缘情况

 #  @"^-?(?:(?:[0-9]|[1-8](?:[0-9]|$))(?:\.(?:[0-9]{1,7}|$))?|9(?:0|$)(?:\.(?:0{1,7}|$))?)?$"

 ^ 
 -?
 (?:
      (?:
           [0-9]  
        |  [1-8] (?: [0-9] | $ )
      )
      (?:
           \. (?: [0-9]{1,7} | $ )
      )?
   |  
      9 (?: 0 | $ )
      (?:
           \. (?: 0{1,7} | $ )
      )?
 )?
 $

答案 3 :(得分:1)

虽然您的问题是我如何使用正则表达式验证纬度,但似乎更好的方法是使用像Decimal.TryParse这样的东西。

 public static bool ValidateLatitudeString(string decimalString)
    {
        decimal validLatitude;
        if (decimal.TryParse(decimalString, out validLatitude))
        {
            if (validLatitude >= -90.0M && validLatitude <= 90.0M)
            {
                return true;
            }
        }

        return false;
    }

答案 4 :(得分:1)

另一种方式^-?[0-8]?\d(?:\.\d*)?|-?90(?:\.0+)?$ Demo

答案 5 :(得分:0)

另一种方式(例如double)-不是正则表达式解决方案,但有效

        bool IsDigitsOnlyLatitudaLongituda(string str, int deg)
        {
    // deg with value 0 is latitude, deg with value 1 is longitude
            bool provjera = true;
            int brojactocki = 0;
            if (str.Length > 0)
            {
                if (str[0] == '.')
                {
                    provjera = false;
                }
                if (str[str.Length - 1] == '.')
                {
                    provjera = false;
                }
            }
            var brojac = 0;
            foreach (char c in str)
            {
                brojac = brojac + 1;
                if (brojac != 1)
                {
                    if (c == '-')
                    {
                        provjera = false;
                    }
                }
                if (c == '.')
                {
                    brojactocki = brojactocki + 1;
                }
            }
            if (brojactocki > 1)
            {
                provjera = false;
            }
            foreach (char c in str)
            {
                if ((c < '0' || c > '9') && (c != '.') && (c != '-'))
                {
                    provjera = false;
                }
            }
            double dblString;
            if (deg == 0)
            {
                if (provjera == true)
                {
                    dblString = Convert.ToDouble(str.Replace(".", ","));
                    if (dblString >= 90 || dblString <= -90)
                    {
                        provjera = false;
                    }
                }
            }
            if (deg == 1)
            {
                if (provjera == true)
                {
                    dblString = Convert.ToDouble(str.Replace(".", ","));
                    if (dblString >= 180 || dblString <= -180)
                    {
                        provjera = false;
                    }
                }
            }
            return provjera;
        }