如何确定从字符串创建的变体是不是为整数?
Posted
技术标签:
【中文标题】如何确定从字符串创建的变体是不是为整数?【英文标题】:How do I determine if a variant created from a string is a whole number?如何确定从字符串创建的变体是否为整数? 【发布时间】:2009-11-25 08:22:14 【问题描述】:我希望确定从字符串创建的变体是否为整数。
这是一个测试脚本:
dim v as variant
v = "42"
if v <> round(v) then
msgBox("<>")
end if
msgBox 弹出,可能是因为变体是从字符串创建的,尽管我本来希望 v 是 = round(v)。
【问题讨论】:
可能值得问问自己是否真的需要处理任何变体和任何整数。一个 1000 位的字符串呢?超出 Long 范围的整数 Doubles 怎么办?如果您准确地指定您需要的内容然后编写代码,将会容易得多。这不是同一个问题,但请参阅 Eric Lippert 在 *** 上对另一个问题的回答:***.com/questions/921180/c-round-up/926806#926806 【参考方案1】:你应该这样写:
if cDbl(v) <> round(cDbl(v)) Then
其中 cDbl 是将任何数据转换为双精度型数字的函数。在调用 cDbl 函数之前,您可能必须处理无法使用 isNumeric() 函数将 v 转换为数字的情况。您甚至可以使用 cInt 函数进行比较:
if isnumeric(v) then
if cDbl(v) - cInt(v) <> 0 Then
....
endif
else
debug.print "data cannot be converted to a number"
endif
【讨论】:
嗯,我的建议是“写这样的东西”而不是“这是保证防弹代码”,但主要思想在这里,即使它需要一些额外的测试。 很抱歉,但我不得不说-1,即使考虑到您对“类似的东西”的警告。您编码的任何一个答案都有错误。如果您提供代码,它应该是正确的,而不是将查找错误作为练习。 -1 用于防守而不是改进。如果您只使用 Clng 而不是 CInt,则该示例很好 ... 我还应该补充一点,在 *** 上发布答案和 cmets 时,我不会放弃我的任何权利,其中包括捍卫我的立场的权利!对不起,伙计们,但我真的觉得你的“冒犯”立场太过分了。如果你有比我更好的答案或建议,为什么不发布呢? @PhilippeGrondier 在阅读了 cmets 之后,我对人们敢于对您的出色答案投反对票感到失望。您以我需要的精神回答了我的问题,我对此非常满意。【参考方案2】:Sub test()
Dim v As Variant
v = "42"
If Val(v) <> Int(Val(v)) Then
MsgBox ("<>")
End If
End Sub
如果你使用 Val(),它会尽力转换成数字。如果不能,它将返回零,并且在这种情况下,Val(v) 将始终等于 Int(Val(v))。
【讨论】:
【参考方案3】:如何检查地板函数与天花板函数是否匹配?
Private Function isWhole(value As Variant) As Boolean
If WorksheetFunction.Ceiling_Math(value) = WorksheetFunction.Floor_Math(value) Then
isWhole = True
Else: isWhole = False
End If
End Function
我遇到了类似的问题,这段代码对我有用。
【讨论】:
【参考方案4】:如果我怀疑数字可能以字符串形式出现,我喜欢使用简单的 +0 技巧。例如对于索引/匹配的东西。像这样:
Dim v As Variant
v = "42"
If IsNumeric(v) Then
If v + 0 <> Round(v + 0) Then
MsgBox ("<>")
End If
End If
这应该适用于日期、文本、数字、数字作为文本。不确定是否或何时中断,应该没问题。
【讨论】:
以上是关于如何确定从字符串创建的变体是不是为整数?的主要内容,如果未能解决你的问题,请参考以下文章