【问题标题】:VB - Convert long String-number to IntegerVB - 将长字符串数字转换为整数
【发布时间】:2013-08-28 09:21:53
【问题描述】:

好的,所以当谈到 VB 中可用的功能时,我并不是很了解。 我有一个包含当前日期和时间的字符串,需要将其转换为整数,以便比较时间。

Dim my_str as String = "201308281110"
Dim my_int as Integer = Convert.ToInt32(my_str)

我显然不能用这个字符串做到这一点。因为我认为它对于 32 位整数来说太长了。我尝试过的所有其他转换也失败了。包括“ToInt64”、“Int”、“CInt”……那么,知道如何将这个较长的字符串转换为整数吗?

【问题讨论】:

  • 我通过一些测试发现整数实际上不能容纳超过 10 位的数字!那么,长整数的另一种数据类型是什么,那么新问题是什么?编辑:尽可能不要小数
  • 小数有什么问题?
  • 为什么要转换成数字?日期/时间通常采用这种格式的全部原因是您可以对它们进行简单的字符串比较。我并不是说这样格式化它们一定是个好主意,但只要它们已经被格式化,你不妨将它们作为字符串进行比较。

标签: vb.net


【解决方案1】:

为什么不直接使用DateDates可以相互比较,所以不用整数比较。

Dim my_date as Date = DateTime.ParseExact(my_str, "yyyyMMddhhmm", System.Globalization.CultureInfo.InvariantCulture)

【讨论】:

  • 正如我所提到的,我不太了解现有的选项。所以我只是先找到我发现的东西.. ;)
【解决方案2】:

通常我不会这样做。已经给出了几个正确的答案,但是由于您仍在学习VB.NET,所以我觉得更全面的答案会对您有所帮助。所以我的回答会重复一些其他人已经说过的话。

Int64Decimal 类型确实大到足以容纳这样的数字。我怀疑Convert.ToInt64 不适合您的原因是因为您试图将结果存储在Integer 变量中,如下所示:

Dim my_str as String = "201308281110"
Dim my_int as Integer = Convert.ToInt64(my_str)  ' Throws an OverflowException

失败的原因不是因为ToInt64 不起作用。声明的那部分实际上工作正常。失败的部分是您将 my_int 变量分配给该值的位置。 my_int 被声明为 Integer。 VB.NET 中的Integer 类型实际上只是Int32 的化名。也就是说,其实和这个是一回事:

Dim my_str as String = "201308281110"
Dim my_int as Int32 = Convert.ToInt64(my_str)  ' Throws an OverflowException, just like the above example

要纠正这个问题,您需要将my_int 变量的类型更改为Int64,这样它就足以容纳ToInt64 函数返回的值。

Dim my_str as String = "201308281110"
Dim my_int as Int64 = Convert.ToInt64(my_str)  ' Works

在 VB.NET 中,LongInt64 的化名,所以在大多数情况下,你应该使用它。但是,如果您要使用Long,则使用ToInt64 方法有点难看。在作业的两侧使用Long 会更容易阅读,如下所示:

Dim my_str as String = "201308281110"
Dim my_int as Long = Long.Parse(my_str)  ' Works, just like above

这也使代码稍微安全一些,因为即使 Long 的大小在未来发生变化(尽管不太可能),它仍然可以工作。

Decimal 类型也将足够大以保存该值,但它会比使用 Long 效率低,所以我不推荐它。

然而,这引出了一个问题,“你为什么要这样做?”如果你需要将值与另一个 Long 变量进行比较,那么这样做是有意义的,但是如何你得到其他Long 值了吗?如果您要从字符串转换两个 Long 值,那么这样做是没有意义的。该字符串已经被格式化,可以很容易地与其他相同格式的字符串进行比较。例如:

Dim dateTime1 As String = "201308281110"
Dim dateTime2 As String = "201308281850"
If dateTime1 > dateTime2 Then
    ' Doesn't get here
End If
If dateTime1 < dateTime2 Then
    ' Get's here
End If
If dateTime1 = dateTime2 Then
    ' Doesn't get here
End If

但是,如果您需要解析值以读取其各个部分(例如日期、时间、年、月、小时),则将值转换为 DateTime 值更有意义。或者,如果您需要将字符串值与已经存储在 DateTime 变量中的另一个值进行比较,那么在这种情况下,将字符串转换为 DateTime 值也是有意义的。在 VB.NET 中,DateTime 的化名就是 Date,所以在大多数情况下,你应该直接使用它,如下所示:

Dim my_str as String = "201308281110"
Dim my_date as Date = Date.ParseExact(my_str, "yyyyMMddHHmm", System.Globalization.CultureInfo.InvariantCulture)
If my_date > Date.Now Then
    ' Do stuff
End If

【讨论】:

    【解决方案3】:

    但是Long.ParseConvert.ToInt64 一样有效,因为它不会溢出(Int32.MaxValue 是 2147483647):

    Dim myLong1 = Long.Parse("201308281110")
    Dim myLong2 = System.Convert.ToInt64("201308281110")
    

    Demo

    注意LongInt64 相同。

    【讨论】:

    • 你没有提到他溢出的原因。
    • @StevenDoggart:我假设他已经知道原因,因为他提到:“我认为 32 位整数太长了”。我还提到了“long 不会溢出”编辑但是,编辑了我的答案。
    • 您是否不需要 Option Infer On 才能按我假设的那样工作? (我喜欢 Option Infer On;有些人强烈反对。)
    • 是的,Option Infer On 始终是我的默认设置。它与 Option Strict Off 不同,因为变量是强类型的,它只是隐式推断(如 C# var)关键字。所以如果很明显,我会省略类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2012-02-21
    • 2010-12-31
    相关资源
    最近更新 更多