我有一个带文本框的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);
}
我目前的正则表达式只允许输入数字,但我还需要执行其他一些限制:
有效纬度值的示例:
我可以通过修改我的正则表达式来实现这些额外的限制吗?如果是这样,怎么样?谢谢!
答案 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;
}