【问题标题】:Test if value is Long or Integer (no decimal places)测试值是 Long 还是 Integer(没有小数位)
【发布时间】:2016-09-06 06:58:37
【问题描述】:

我需要测试 textbox1 和 textbox2 中的值是整数还是长整数(没有小数位)。

我尝试过这样的事情:

    Dim x As Integer
    Dim y As Integer

    x = TextBox1.Value
    y = TextBox2.Value

    If x = Int(x) Then
        'my code
    Else
        MsgBox("value is not an integer")

如果我输入 x=2.3,它不会显示 MsgBox,但会将值四舍五入为 2。

【问题讨论】:

  • 我会检查 TextBox1.Value 是否为整数,因为在您设置 x 时,该值已四舍五入。 x 将保持一个整数,而 TextBox1.Value 不必是一个。
  • 哦,我没想到。现在完美了,谢谢
  • 通常,您可以将值分配给整数(隐式截断十进制数字),重新分配给浮点数并与源进行比较。或者,将源编号与其舍入值进行比较。如果相同,则为整数,否则为小数位。
  • @Bathsheba 刚刚发送了我上面提到的相同解决方案。
  • @FDavidov:是的,这不是一个糟糕的方法,尽管它会在 2 的 52 次方之后失效。顺便说一句,请考虑重新制定你的 cmets 来回答:我会投票。

标签: excel vba integer long-integer


【解决方案1】:

由于您已将x类型 指定为Integer,因此从文本框字符串到Integer 的转换已经发生。因此Int(x) 是无操作的。

一个解决方法是使用类似的东西

If IsNumber(TextBox1.Value) Then
    If Fix(TextBox1.Value) = TextBox1.Value Then
        'I am an integeral type.
    End If
End If

这里,Fix 截断数字类型,我依靠 VBA 进行正确比较。请注意,VBA 没有实现 短路 And,因此您需要使用嵌套的 If 或类似的。

【讨论】:

    【解决方案2】:

    您不能在 VBA 中使用 Dim var as Decimal,但可以使用 Dim var as Variant 并使用 var = CDec(...) 在变体中存储十进制数据类型。即便如此,我发现小数点后有 14 个或 15 个零的小数点后跟一个数字(或从整数中减去的等效小数点)会四舍五入为整数。我还没有找到区分小数和整数的解决方案。

    【讨论】:

      【解决方案3】:

      这是另一种方法(伪代码,请检查语法!)

      Dim l_Temp_D1 as Decimal
      Dim l_Temp_D2 as Decimal
      Dim l_Temp_I  as Integer
      
      l_Temp_I  = TextBox1.Value
      l_Temp_D1 = TextBox1.Value
      l_Temp_D2 = l_Temp_I
      
      if (not IsNumber(TextBox1.Value)) then
          ' Error!!!
      End If
      
      if (l_Temp_D1 = l_Temp_D2) then
        ' Integer
        ...
      else
        ' Float
        ...
      End If
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      相关资源
      最近更新 更多