【问题标题】:Integer.TryParse - a better way?Integer.TryParse - 更好的方法?
【发布时间】:2009-01-07 02:47:55
【问题描述】:

我发现自己经常需要使用 Integer.TryParse 来测试一个值是否为整数。但是,当您使用 TryParse 时,您必须将引用变量传递给函数,所以我发现自己总是需要创建一个空白整数来传递。通常它看起来像:

Dim tempInt as Integer
If Integer.TryParse(myInt, tempInt) Then

考虑到我想要的只是一个简单的真/假响应,我觉得这很麻烦。有没有更好的方法来解决这个问题?为什么没有一个重载函数,我可以只传递我想要测试的值并获得真/假响应?

【问题讨论】:

  • “那么”之后是什么?你不把它当作一个整数做点什么吗?如果不是,你为什么关心它是否是一个整数?
  • 您可以编写自己的检查以确保它只包含数字并且不会太大。但这可能比库调用要慢。
  • 可以在TryParse的第二个参数中传入0,不需要声明。
  • 我不喜欢在“那么”之后做任何事情,我只想检查以确保事情是整数。它让我感到内心温暖而模糊。谢谢,我不知道为什么我没有想到简单地传递 0 或什么都不传递。这将解决问题。

标签: vb.net tryparse


【解决方案1】:

不需要声明整数。

If Integer.TryParse(intToCheck, 0) Then

If Integer.TryParse(intToCheck, Nothing) Then

如果你有 .Net 3.5 的能力,你可以为字符串创建一个扩展方法。

Public Module MyExtensions

    <System.Runtime.CompilerServices.Extension()> _
    Public Function IsInteger(ByVal value As String) As Boolean
        If String.IsNullOrEmpty(value) Then
            Return False
        Else
            Return Integer.TryParse(value, Nothing)
        End If
    End Function

End Module

然后像这样调用:

If value.IsInteger() Then

很抱歉,我知道,你走神了,但你也可以在 .Net 3.5 中将它添加到上面的 MyExtensions 类中,除非你需要验证,否则不用担心。

<System.Runtime.CompilerServices.Extension()> _
Public Function ToInteger(ByVal value As String) As Integer
    If value.IsInteger() Then
        Return Integer.Parse(value)
    Else
        Return 0
    End If
End Function

然后简单地使用

value.ToInteger()

如果不是有效的整数,则返回 0。

【讨论】:

  • 在我的版本中添加了“Nothing”和 +1
  • +1,C# 注释与问题无关,因为它指定了 vb.net。
  • 恭喜,Tom,您的回答非常简洁,并且变成了 500 字的糊状文章。 :-)
  • 我真的会称之为 ToIntegerOrDefault()。 ToInteger 向我暗示它实际上是一个整数。此外,直接在 ToInteger 方法中执行 Integer.TryParse 效率更高。否则 Parse 将发生两次。
  • +1 不错的答案汤姆。顺便说一句,ToInteger 函数被声明为“As Boolean”。您应该将其编辑为“作为整数”。
【解决方案2】:

由于您使用的是 VB.net,因此您可以使用 IsNumeric 函数

If IsNumeric(myInt) Then
    'Do Suff here
End If

【讨论】:

  • 您不需要 VB,“VB 运行时”是 .NET 框架的一部分,可以在 C# 中正常工作
  • IsNumeric 仅在 .NET 中提供旧版支持。 TryParse 是更好的选择。
  • 小心 IsNumeric,即使对于某些非整数值,它也会返回 true。从 MSDN 页面“如果 Expression 的数据类型是 Boolean、Byte、Decimal、Double、Integer、Long、SByte、Short、Single、UInteger、ULong 或 UShort,或者包含这些数字类型之一的 Object,IsNumeric 将返回 True . 如果 Expression 是可以成功转换为数字的 Char 或 String,它也返回 True。"
【解决方案3】:
public static class Util {

    public static Int32? ParseInt32(this string text) {
        Int32 result;
        if(!Int32.TryParse(text, out result))
            return null;
        return result;
    }

    public static bool IsParseInt32(this string text) {
        return text.ParseInt32() != null;
    }

}

【讨论】:

  • 现在可空值有很大的用处!
  • 如果从头开始重新设计框架库以利用泛型和可空值,那不是很好吗?
【解决方案4】:

试试这个代码。

Module IntegerHelpers

  Function IsInteger(ByVal p1 as String) as Boolean
    Dim unused as Integer = 0
    return Integer.TryParse(p1,unused)
  End Function
End Module

好的部分是因为它被声明为模块级函数,它可以在没有限定符的情况下使用。示例用法

return IsInteger(mInt)

【讨论】:

  • @Tom,正如提问者所指出的那样。 TryParse 需要一个变量。我将其命名为未使用,以表明它实际上不会被使用。我本可以传递 0,但我希望它更清楚,它是一个未使用的引用。
  • @Tom,当您不使用编译器来验证您的解决方案时,您会得到这样的结果:(。已修复
【解决方案5】:

为什么不写一个扩展方法来清理你的代码呢?好久没写VB.Net了,这里有一个c#的例子:

public static class MyIntExtensionClass
{
  public static bool IsInteger(this string value)
  {
    if(string.IsNullOrEmpty(value))
      return false;

    int dummy;
    return int.TryParse(value, dummy);
  }
}

【讨论】:

  • 不错的建议,不过应该发布一个 vb.net 版本,除了删除参数中的“this”,将 Extension 属性添加到方法中,将其放入模块中(无需模块中的静态函数),并删除分号并将 brak 替换为 end *.
  • 另外,他可能没有使用.Net 3.5
【解决方案6】:

J Ambrose Little 执行timing tests for IsNumeric checks back in 2003。您可能希望使用 v2 的 CLR 重试上述测试。

【讨论】:

    【解决方案7】:

    一个变体是:

    Int32.TryParse(input_string, Globalization.NumberStyles.Integer)
    

    【讨论】:

    • Int32.TryParse 的文档不包含此重载 (String, NumberStyles),而是包含 (String, NumberStyles, IFormatProvider, Int32)
    • 这是文档中的第一个:TryParse(String, Int32)
    • 但是用法不对!来自文档:当此方法返回时,[result] 包含与 s 中包含的数字等效的 32 位有符号整数值。您所指的方法 (String, Int32) 是这样的,字符串的解析值将存储在 Int32 参数中(因为 ByRef 关键字)!所以这就像是在说“解析整数,并将其存储在这个名为Globalization.NumberStyles.Integer的变量中”,这是没有意义的。
    • 好的,如果你最后只需要Boolean 值,那么我建议用Nothing 替换Globalization.NumberStyles.Integer,因为它无论如何都没有效果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2010-12-22
    • 2017-06-26
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多