Vb.net VB-将长字符串数字转换为整数
好的,所以当涉及到VB中可以使用的函数时,我不是很有方向性。 我有一个包含当前日期和时间的字符串,需要将其转换为整数,以便比较时间Vb.net VB-将长字符串数字转换为整数,vb.net,Vb.net,好的,所以当涉及到VB中可以使用的函数时,我不是很有方向性。 我有一个包含当前日期和时间的字符串,需要将其转换为整数,以便比较时间 Dim my_str as String = "201308281110" Dim my_int as Integer = Convert.ToInt32(my_str) 显然,我用这根绳子做不到。因为我认为它对于32位整数来说太长了。我尝试过的所有其他转换也都失败了。包括“ToInt64”,“Int”,“CInt”。。。那么,您知道如何将这个较长的字符串转换为整
Dim my_str as String = "201308281110"
Dim my_int as Integer = Convert.ToInt32(my_str)
显然,我用这根绳子做不到。因为我认为它对于32位整数来说太长了。我尝试过的所有其他转换也都失败了。包括“ToInt64”,“Int”,“CInt”。。。那么,您知道如何将这个较长的字符串转换为整数吗?但是
Long.Parse
与convert.ToInt64
一样有效,因为它不会溢出(is 2147483647):
请注意,这与
Int64
相同,为什么不直接使用Date
?您可以相互比较日期
,因此无需使用整数进行比较
Dim my_date as Date = DateTime.ParseExact(my_str, "yyyyMMddhhmm", System.Globalization.CultureInfo.InvariantCulture)
通常我不会这么做。已经给出了几个正确的答案,但由于您仍在学习VB.NET,我觉得一个更全面的答案会对您有所帮助。因此,我的回答将重复其他人已经说过的一些话
Int64
和Decimal
类型确实足够大,可以容纳这样的数字。我怀疑Convert.ToInt64
不适用于您的原因是您试图将结果存储在Integer
变量中,如下所示:
Dim my_str as String = "201308281110"
Dim my_int as Integer = Convert.ToInt64(my_str) ' Throws an OverflowException
Dim my_str as String = "201308281110"
Dim my_int as Long = Long.Parse(my_str) ' Works, just like above
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
失败的原因不是因为ToInt64
不工作。声明的这一部分实际上运作良好。失败的部分是将my_int
变量指定给该值my_int
被声明为整数
。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中,Long
是Int64
的笔名,因此在大多数情况下,您应该使用它。但是,如果要使用Long
,那么使用ToInt64
方法有点难看。在作业的两边使用Long
会更容易阅读,如下所示:
Dim my_str as String = "201308281110"
Dim my_int as Integer = Convert.ToInt64(my_str) ' Throws an OverflowException
Dim my_str as String = "201308281110"
Dim my_int as Long = Long.Parse(my_str) ' Works, just like above
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
这也使得代码稍微安全一些,因为即使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
我通过测试发现,一个整数实际上不能容纳超过10位的数字!那么,长整数的另一种数据类型是什么呢?编辑:如果可能的话,没有小数。小数有什么问题?为什么要转换成数字?日期/时间通常采用这种格式的全部原因是,您可以对它们进行简单的字符串比较。我并不是说这样格式化它们一定是个好主意,但只要它们已经这样格式化了,您就可以将它们作为字符串进行比较。正如我所提到的,我不太关注现有的选项。因此,我只需遵循我首先发现的你没有提到为什么它对他来说是溢出的。@Stevendogart:我认为他已经知道了原因,因为他提到:“我认为它对于32位整数来说太长了”。我还提到“long不会溢出”。编辑,但是,编辑了我的答案。你们不需要选项推断为工作,因为我认为你们打算?(我喜欢Option Inferre On;有些人强烈反对。)是的,Option Inferre On始终是我的默认设置。它与Option Strict Off不同,因为变量是强类型的,它只是隐式推断的(比如C#
var
)关键字。所以我省略了类型,如果它是明显的。