2

我有一个网页,一次显示一个目录中的 10 张图像。在目录中,我现在有 55,000 张图像。一旦 zz 低于 32,767,它就会停止。如何使 ZZ 成为子类型 LONG 以使其成为 2,147,483,647(下面的代码不准确,只是快速完成以向您展示我正在实现的循环)

pp = Request("pp")  ' pp could be at 40000

filecount = 0 

dim zz

For Each file in filecoll

    zz = zz + 1

    If ZZ > PP then 

        response.write  'show image here 

    end if

Next
4

1 回答 1

7

实际问题与长类型无关 - 至少不是直接的。您的问题是这pp是一个字符串,而它应该是数字。要解决您的问题,只需将其转换为 long:

pp = CLng(Request("pp"))

然后比较就可以正常工作了。

简而言之,问题在于比较两个变量时 - 正如 Eric Lippert 在这篇精彩的博客文章中所解释的那样,当一个变量包含一个字符串值并且一个变量包含数值并且你比较它们时,任何字符串都大于任何数字- 所以不管它的价值是zz什么,意味着pp它将永远更大。

现在进行更详细的解释。(使用Nilpo的一些帮助)

在 VBScript 中,所有变量实际上都是 Variant 类型。它们是松散类型的,这意味着它们可以在任何时候保存任何类型的数据,并且它们包含的值的类型可以更改。

VBScript 的比较运算符(<、>、<>、=)用于进行数值比较。由于字符串不是数字数据类型,因此在将字符串与数字进行比较时,这些比较运算符永远不会返回可用的结果。这并不意味着字符串不能包含数值。它可以包含一串数字或表示数值的字母,例如“4.56”、“4.5e3”或“十五”。在这种情况下,VBScript 提供了一系列转换函数,指示 VBS 解释器将值视为特定类型。它还提供了IsNumeric返回 true 或 false 的函数来指示是否可以将字符串值视为数字。

考虑到所有这些,正确的做法是:

pp = Request("pp")

filecount = 0

Dim zz = 0

For Each file In filecoll
    zz = zz + 1
    '...
Next

If IsNumeric("pp") Then
    If zz > CLng(pp) Then
        Response.Write  'show image here
    End If
Else
    ' pp is not a number, perhaps it is empty or contains bad characters
End If

其他要记住的事情:

  1. 包含单个值的 Variant 是字符串或数值数据类型。这意味着货币或日期和布尔值等数据类型本质上是数字。
  2. 变体还可能包含对对象和数组的引用。与字符串一样,它们不能用于数值比较。
  3. Null、Empty 和 Nothing 也是要考虑的指示变量状态的有效值。当变量未分配实际值时使用这些。作为非数字,它们在数字比较中不起作用。
  4. VBScript 提供了用于比较非数字值的特定函数和运算符。
  5. 因为 VBScript 不使用严格的数据类型,所以在比较不同精度的数字时,数据宽度不是问题。为了比较,两个操作数将在更宽的数据宽度上进行比较。(算术运算也是如此。在这种情况下,结果值将具有更宽的数据宽度以保持精度。)
于 2012-08-06T13:30:24.633 回答