【问题标题】:How to check if IsNumeric [duplicate]如何检查 IsNumeric [重复]
【发布时间】:2012-03-22 01:49:42
【问题描述】:

可能重复:
How to identify if string contain a number?

在 VB 中有一个 IsNumeric 函数,在 c# 中有类似的东西吗?

为了解决这个问题,我只写了代码:

    if (Int32.Parse(txtMyText.Text.Trim()) > 0)

我只是想知道是否有更好的方法来做到这一点。

【问题讨论】:

    标签: c#


    【解决方案1】:

    你可以写一个扩展方法:

    public static class Extension
    {
        public static bool IsNumeric(this string s)
        {
            float output;
            return float.TryParse(s, out output);
        }
    }
    

    【讨论】:

    • 我宁愿称该方法为IsInteger。数字很​​模糊。
    • @CodeInChaos - 当然,为什么不呢。我也不会调用类扩展,我更关心这个想法。
    • 这不会重复像"$100"这样的字符串的行为。
    • @phoog - 我并没有试图复制任何东西,只是提供了一个比一直调用 Int32.Parse 更好的选择。如果您愿意,请随时写一个替换并与我们分享。
    • 或使用 c# 7.0 在一个衬里 return float.TryParse(s, out _);
    【解决方案2】:

    您应该使用TryParse - 如果字符串不是有效数字,Parse 会抛出异常 - 例如如果你想测试一个有效的整数:

    int v;
    if (Int32.TryParse(textMyText.Text.Trim(), out v)) {
      . . .
    }
    

    如果你想测试一个有效的浮点数:

    double v;
    if (Double.TryParse(textMyText.Text.Trim(), out v)) {
      . . .
    }
    

    还要注意Double.TryParse 有一个重载版本,带有额外的参数,指定控制解析过程的各种规则和选项 - 例如本地化('.' 或 ',') - 请参阅 http://msdn.microsoft.com/en-us/library/3s27fasw.aspx

    【讨论】:

    • 例如,Int32.TryParse1E2 返回false,而IsNumeric 返回true
    • 那么有Double.TryParse - 我正在更新我的答案
    • 根据文档 Parse 和 TryParse 忽略空格。这使得 Trim() 变得不必要。 docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/…
    • 记住 Int 的最大值是 2147483647。您可以考虑使用 long (9223372036854775807) 或 ulong (18446744073709551615) 来支持更大的数字。
    【解决方案3】:

    我认为你需要一些更通用的东西。试试这个:

    public static System.Boolean IsNumeric (System.Object Expression)
    {
        if(Expression == null || Expression is DateTime)
            return false;
    
        if(Expression is Int16 || Expression is Int32 || Expression is Int64 || Expression is Decimal || Expression is Single || Expression is Double || Expression is Boolean)
            return true;
    
        try 
        {
            if(Expression is string)
                Double.Parse(Expression as string);
            else
                Double.Parse(Expression.ToString());
                return true;
            } catch {} // just dismiss errors but return false
            return false;
        }
    }
    

    希望对你有帮助!

    【讨论】:

    • 这是一个比其他所有答案都好得多的答案,但它仍然与IsNumeric 的功能不匹配。
    • 我喜欢先检查数据类型的方法,但我建议使用Double tmp; var isSuccess=Double.TryParse(Expression as string, out tmp); return isSuccess;而不是周围的try-catch块来修改代码的第二部分。
    【解决方案4】:

    TryParse 方法,它返回一个布尔值,指示转换是否成功。

    【讨论】:

    • 看起来这可能是更好的选择,谢谢....
    • TryParse 方法不会给出与IsNumeric 相同的结果。
    【解决方案5】:

    其他答案建议使用TryParse,这可能符合您的需求,但提供IsNumeric 函数功能的最安全方法是引用VB 库并使用IsNumeric 函数。

    IsNumericTryParse 更灵活。例如,IsNumeric 为字符串"$100" 返回true,而TryParse 方法都返回false

    要在 C# 中使用 IsNumeric,请添加对 Microsoft.VisualBasic.dll 的引用。该函数是Microsoft.VisualBasic.Information类的静态方法,所以假设你有using Microsoft.VisualBasic;,你可以这样做:

    if (Information.IsNumeric(txtMyText.Text.Trim())) //...
    

    【讨论】:

    • 我不确定我是否希望 "$100" 是数字的结果为“真”?!
    • @cederlof 我也不确定您是否会这样做,除非您尝试复制问题中提到的 Visual Basic 的 IsNumeric 函数。该函数为“$100”返回 true。例如,如果您试图重现 Excel VBA 过程的行为,您可能希望函数为“$100”返回 true,并且您可能最好使用 Microsoft.VisualBasic.dll,而不是尝试编写自己的替换功能。
    【解决方案6】:

    您应该使用 TryParse 方法,该方法将数字的字符串表示形式转换为其等效的 32 位有符号整数。返回值表示转换是否成功。

        int intParsed;
        if(int.TryParse(txtMyText.Text.Trim(),out intParsed))
        {
            // perform your code
        }
    

    【讨论】:

    【解决方案7】:

    有一个更好的方法:

    int valueParsed;
    if(Int32.TryParse(txtMyText.Text.Trim(), out valueParsed))
    { ... }
    

    如果您尝试解析文本但无法解析,则 Int32.Parse 方法将引发异常。我认为您最好使用 TryParse 方法,该方法将捕获异常并在遇到任何异常时以布尔值的形式通知您。

    Int32.Parse 考虑到了解析文本的许多复杂性。重复努力是愚蠢的。因此,这很可能是 VB 的 IsNumeric 采用的方法。您还可以通过 NumberStyles 枚举自定义解析规则,以允许使用十六进制、十进制、货币和其他几种样式。

    另一种非基于 Web 的应用程序的常见方法是将文本框的输入限制为仅接受可解析为整数的字符。

    编辑:通过指定特定的 NumberStyles,您可以接受更多种类的输入格式,例如货币值(“$100”)和指数(“1E4”):

    int valueParsed;
    if(Int32.TryParse(txtMyText.Text.Trim(), NumberStyles.AllowCurrencySymbol | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out valueParsed))
    { ... }
    

    ...或通过允许任何类型的支持格式:

    int valueParsed;
    if(Int32.TryParse(txtMyText.Text.Trim(), NumberStyles.Any, CultureInfo.CurrentCulture, out valueParsed))
    { ... }
    

    【讨论】:

    • IsNumeric"1E2""$100" 等字符串返回true,而Int32.TryParse 为这些字符串返回false。
    • @phoog 默认行为是不支持科学概念或货币价值。您可以通过传入 NumberStyles 选项的组合来调整行为,例如:Int32.TryParse("1E2", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowExponent, CultureInfo.CurrentCulture, out valueParsed)。您还可以指定 NumberStyles.Any,这很可能是 VB 的 IsNumeric 在幕后所做的。
    • 当然可以,但是如果我需要在 C# 项目中复制 IsNumeric 的功能,我只会调用 IsNumeric 而不是编写新的 C# 代码并尝试确保我'已经正确地涵盖了所有角落案例。
    猜你喜欢
    • 2012-10-12
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多