考虑在C#中需要一个函数来测试字符串是否是数值。
要求:
using Microsoft.VisualBasic
来调用IsNumeric()
。这是一个重新发明轮子的案例,但运动很好。目前的实施:
//determine whether the input value is a number
public static bool IsNumeric(string someValue)
{
Regex isNumber = new Regex(@"^\d+$");
try
{
Match m = isNumber.Match(someValue);
return m.Success;
}
catch (FormatException)
{return false;}
}
问题:如何改进,以便正则表达式匹配负数和小数?你做了哪些彻底的改进?
答案 0 :(得分:19)
刚刚离开我的头脑 - 为什么不使用double.TryParse
?我的意思是,除非你真的想要一个正则表达式解决方案 - 在这种情况下我不确定你真的需要它:)
答案 1 :(得分:10)
你能使用.TryParse吗?
int x;
double y;
string spork = "-3.14";
if (int.TryParse(spork, out x))
Console.WriteLine("Yay it's an int (boy)!");
if (double.TryParse(spork, out y))
Console.WriteLine("Yay it's an double (girl)!");
答案 2 :(得分:6)
Regex isNumber = new Regex(@"^[-+]?(\d*\.)?\d+$");
更新为允许在号码前面加上+或 - 。
编辑:您的try
块没有执行任何操作,因为其中的任何方法都没有实际抛出FormatException
。整个方法可以写成:
// Determine whether the input value is a number
public static bool IsNumeric(string someValue)
{
return new Regex(@"^[-+]?(\d*\.)?\d+$").IsMatch(someValue);
}
答案 3 :(得分:1)
好吧,对于底片,你需要在开头包含一个可选的减号:
^-?\d+$
对于小数,您需要考虑小数点:
^-?\d*\.?\d*$
可能的指数表示法:
^-?\d*\.?\d*(e\d+)?$
答案 4 :(得分:0)
除非你真的想在另一个Q& A中使用正则表达式Noldorin posted a nice extension method。
<强>更新强>
正如帕特里克正确指出的那样,该链接指向一个扩展方法,该方法检查对象是否是数字类型,而不是它是否代表数值。然后使用Saulius和yodaj007建议的double.TryParse
可能是最好的选择,处理各种带有不同小数分隔符,千位分隔符等的怪癖。只需用一个很好的扩展方法将其包装起来:
public static bool IsNumeric(this string value)
{
double temp;
return double.TryParse(value.ToString(), out temp);
}
......然后开火:
string someValue = "89.9";
if (someValue.IsNumeric()) // will be true in the US, but not in Sweden
{
// wow, it's a number!
]
答案 5 :(得分:0)
我不能说我会使用正则表达式来检查字符串是否是数值。这么简单的过程既缓慢又沉重。我只是一次遍历字符串一个字符,直到我进入无效状态:
public static bool IsNumeric(string value)
{
bool isNumber = true;
bool afterDecimal = false;
for (int i=0; i<value.Length; i++)
{
char c = value[i];
if (c == '-' && i == 0) continue;
if (Char.IsDigit(c))
{
continue;
}
if (c == '.' && !afterDecimal)
{
afterDecimal = true;
continue;
}
isNumber = false;
break;
}
return isNumber;
}
上面的例子很简单,应该为大多数数字完成工作。然而,它并不具有文化敏感性,但它应该是足够的,以使其具有文化敏感性。
答案 6 :(得分:0)
另外,请确保生成的代码通过土耳其测试:
http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html