【问题标题】:IsNumeric function in c#C#中的IsNumeric函数
【发布时间】:2014-05-12 17:27:03
【问题描述】:

我知道可以使用 try/catch 语句检查文本框或变量的值是否为数字,但IsNumeric所以要简单得多。我当前的一个项目需要从文本框中恢复值。不幸的是,它是用 C# 编写的。

我知道有一种方法可以通过添加对 Visual Basic 的引用来在 Visual C# 中启用 Visual Basic IsNumeric 函数,但我不知道它的语法。我需要的是在 C# 中启用IsNumeric 函数的清晰简洁的演练。我不打算使用 Visual Basic 固有的任何其他功能。

【问题讨论】:

标签: c# function parsing try-catch numeric


【解决方案1】:

你可以创建一个辅助方法。比如:

public bool IsNumeric(string input) {
    int test;
    return int.TryParse(input, out test);
}

【讨论】:

  • private void btnOK_Click(object sender, EventArgs e) { if (startingbudget.IsNumeric()) { MessageBox.Show("This is a number."); } }
  • 现在你可以输入return int.TryParse(input, out int test);
  • 对于 C# 7,返回可以使用丢弃/忽略下划线,而无需进行 int 测试。像这样:return int.TryParse(input, out _);
【解决方案2】:

试试下面的代码 sn-p。

double myVal = 0;
String myVar = "Not Numeric Type";

if (Double.TryParse(myVar , out myNum)) {
  // it is a number
} else {
  // it is not a number
}

【讨论】:

    【解决方案3】:

    http://msdn.microsoft.com/en-us/library/wkze6zky.aspx

    菜单: 项目-->添加参考

    单击:程序集、框架

    勾选 Microsoft.VisualBasic。

    点击确定。

    该链接适用于 Visual Studio 2013,您可以将“其他版本”下拉菜单用于不同版本的 Visual Studio。

    在所有情况下,您都需要添加对 .NET 程序集“Microsoft.VisualBasic”的引用。

    在您需要的 c# 文件的顶部:

    using Microsoft.VisualBasic;
    

    那你可以看看写代码了。

    代码类似于:

       private void btnOK_Click(object sender, EventArgs e)
       {
          if ( Information.IsNumeric(startingbudget) )
          {
             MessageBox.Show("This is a number.");
          }
       }
    

    【讨论】:

    • “其他版本”下拉菜单?在哪里? (VS 2012)
    • 在网页顶部。 VS 2012 的链接也在这里:msdn.microsoft.com/en-us/library/wkze6zky(v=vs.110).aspx
    • 它不工作。我尝试以与在 VB 中相同的方式使用它,但它一直以错误的形式出现。你确定这个过程有效吗?
    • 您是否设法添加了参考?你的错误信息是什么?您使用的代码是什么?您将能够使用此过程使其发挥作用。
    • private void btnOK_Click(object sender, EventArgs e) { if (startingbudget.IsNumeric()) { MessageBox.Show("This is a number."); } }
    【解决方案4】:

    要完全窃取比尔的答案,您可以创建一个扩展方法并使用一些语法糖来帮助您。

    创建一个类文件,StringExtensions.cs

    内容:

    public static class StringExt
    {
        public static bool IsNumeric(this string text)
        {
            double test;
            return double.TryParse(text, out test);
        }
    }
    

    编辑:这是用于更新的 C# 7 语法。内联声明参数。

    public static class StringExt
    {
        public static bool IsNumeric(this string text) => double.TryParse(text, out _);
    
    }
    

    调用方法如下:

    var text = "I am not a number";
    text.IsNumeric()  //<--- returns false
    

    【讨论】:

    • 方法声明中不需要(这个字符串文本)吗?
    • 是的,你是对的。感谢您注意到我的错字。 :)
    • 您现在可以将“out double test”替换为“out _”(注意“double”也已消失)。下划线是 C# 7 中的“假”丢弃变量。它可以在同一范围内多次使用,因为它不是真正的变量。它没有实际类型。
    • 我喜欢这个主意。添加一个检查字符串是否包含 null 或空格以使其更健壮,例如 public static bool IsNumeric(this string text) =&gt; (string.IsNullOrWhiteSpace(text)) ? false : double.TryParse(text, out _); 怎么样?
    • Null、Empty String 和 Whitespace 都将失败并从 TryParse 返回 false。我喜欢 string.IsNullOrWhitespace 但在这种情况下是因为额外检查恕我直言。
    【解决方案5】:

    我通常使用扩展方法来处理这样的事情。这是在控制台应用程序中实现的一种方式:

    namespace ConsoleApplication10
    {
        class Program
        {
            static void Main(string[] args)
            {
                CheckIfNumeric("A");
                CheckIfNumeric("22");
                CheckIfNumeric("Potato");
                CheckIfNumeric("Q");
                CheckIfNumeric("A&^*^");
    
                Console.ReadLine();
            }
    
            private static void CheckIfNumeric(string input)
            {
                if (input.IsNumeric())
                {
                    Console.WriteLine(input + " is numeric.");
                }
                else
                {
                    Console.WriteLine(input + " is NOT numeric.");
                }
            }
        }
    
        public static class StringExtensions
        {
            public static bool IsNumeric(this string input)
            {
                return Regex.IsMatch(input, @"^\d+$");
            }
        }
    }
    

    输出:

    A 不是数字。

    22 是数字。

    土豆不是数字。

    Q 不是数字。

    A&^*^ 不是数字。

    Note, here are a few other ways to check for numbers using RegEx.

    【讨论】:

    • 为什么不保存代码而只创建一个静态方法? public static bool IsNumeric(string input) { return Regex.IsMatch(input, @"^\d+$"); }
    • 就像它所依赖的任何东西一样。这里的假设是应用程序会增长并且 StringExtensions 类也将被添加到,从而为所有这些东西创建一个集中的地方。更何况上面的方法确实已经是静态的了。
    【解决方案6】:

    是数字可以通过多种方式实现,但我用我的方式

    public bool IsNumeric(string value)
    {
        bool isNumeric = true;
        char[] digits = "0123456789".ToCharArray();
        char[] letters = value.ToCharArray();
        for (int k = 0; k < letters.Length; k++)
        {
            for (int i = 0; i < digits.Length; i++)
            {
                if (letters[k] != digits[i])
                {
                    isNumeric = false;
                    break;
                }
            }
        }
        return isNumeric;
    }
    

    【讨论】:

    • 为什么投反对票?它可能比 Linq 方式涉及更多的代码行,但它的作用很清楚,而且可能同样快,如果不是更快的话。也不依赖系统之外的任何框架
    • 此外,.IsNumeric 和 .IsDigit 可能对 0 到 9 以外的字符返回 true,请参见此处stackoverflow.com/questions/228532/…
    【解决方案7】:
    public bool IsNumeric(string value)
    {
        return value.All(char.IsNumber);
    }
    

    【讨论】:

    • 使用[type].TryParse(string, out [type])时不能假设数字字符串在[type]的允许范围内时的最佳答案
    • 这个答案很好,但是该方法应该被称为 IsOnlyNumbers 以清楚它的作用。例如,对于十进制或货币值,它将返回 false
    • public static bool IsNumeric(string value) =&gt; value.All(char.IsNumber);??
    • public static bool IsNumeric(this string value) =&gt; value.All(char.IsNumber); ????????
    • 另请注意,对于 TryParse 将返回 false 的空字符串,这将评估为 true。
    【解决方案8】:

    使用 C# 7 (.NET Framework 4.6.2),您可以将 IsNumeric 函数编写为单行:

    public bool IsNumeric(string val) => int.TryParse(val, out int result);
    

    请注意,上述函数仅适用于整数 (Int32)。但是你可以为其他数值数据类型实现相应的函数,比如long、double等。

    【讨论】:

      【解决方案9】:

      值得一提的是,可以根据 Unicode 类别检查字符串中的字符 - 数字、大写、小写、货币等。下面是两个使用 Linq 检查字符串中数字的示例:

      var containsNumbers = s.Any(Char.IsNumber);
      var isNumber = s.All(Char.IsNumber);
      

      为了清楚起见,上面的语法是一个较短的版本:

      var containsNumbers = s.Any(c=>Char.IsNumber(c));
      var isNumber = s.All(c=>Char.IsNumber(c));
      

      链接到 MSDN 上的 unicode 类别:

      UnicodeCategory Enumeration

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-26
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        相关资源
        最近更新 更多