有没有比在Double.TryParse中测试C#中的整数更好的方法?

时间:2008-12-31 08:13:25

标签: c#-3.0 methods

Double.TryParse返回一个值,我不需要值。我需要能够判断字符串是否为数字并且只返回一个bool。

有没有办法做到这一点?

6 个答案:

答案 0 :(得分:13)

我会考虑完全您需要确定的内容。 “数字”比起初听起来更模糊。请考虑以下字符串,以及是否要将它们视为数字:

  • “南”
  • “南”
  • “无限”
  • “0.000000000000000000000000000000000000000000000000001”
  • “1E5”
  • “1e500”
  • “1000”
  • “+ 1”

使用Double.TryParse(具有en-GB文化 - 不要忘记文化问题!)会给你真,假,真,真(尽管它不可​​表示),真,假。是的,真的。

如果您想知道以后对Double.TryParse的调用是否成功,在此处调用它将是最准确的解决方案。如果您使用其他一些标准,正则表达式可能更合适。您可能使用的标准示例:

  • 可以是+或 - ,但仅限于第一个字符
  • 任何角色都可以有一个句号。你可能想在最后避免一个 - 应该“1”。有效吗?
  • 除上述内容外,所有字符必须为数字

除了上面的第四个也是最后一个例子之外,这将是不允许的。

编辑:我现在已经注意到问题的标题包括“整数”。这大大减少了规范检查:

  • 您是否要允许前导零(例如-00012)?
  • 范围是多少?
  • 您是否只需要小数(而不是十六进制等)?
  • 你需要接受数以千计的分隔符吗?
  • 您对领先/尾随空白的政策是什么?

答案 1 :(得分:8)

好吧,你可能使用正则表达式,但为什么不放弃Double.TryParse中的值并继续?我不认为尝试复制此代码是值得的。

答案 2 :(得分:5)

一种方法是添加对Microsoft.VisualBasic的引用,然后使用Information.IsNumeric().

using Microsoft.VisualBasic;

...

if (Information.IsNumeric("1233434.0"))
{
    Console.WriteLine("Yes");
}

答案 3 :(得分:1)

正则表达式怎么样?

string s = "13.2";
bool bIsDecimal = Regex.IsMatch("^-?\d+(\.\d+)?$");

应该测试它是否是十进制值。它不会告诉你的是它是否是一个有效的小数,因为数字是否适合小数范围。

答案 4 :(得分:1)

我刚刚启动了Visual Studio Express(2005年和2008年)。 Intellisense说Double.TryParse()的返回值是一个bool。以下在有限的测试中为我工作了......

double res; // you must be under very resource-constrained 
            // conditions if you can't just declare a double
            // and forget about it

if (Double.TryParse(textBox1.Text, out res)) {
    label1.Text = "it's a number";
} else {
    label1.Text = "not a number";
}

答案 5 :(得分:0)

试试这个isnumeric:

public static bool IsNumeric(object Expression)

{

  bool isNum;

  double retNum;

  isNum = Double.TryParse(Convert.ToString(Expression), System.Globalization.NumberStyles.Any,System.Globalization.NumberFormatInfo.InvariantInfo, out retNum );

  return isNum;

}