2

ディレクトリから一度に 10 個の画像を表示する Web ページがあります。ディレクトリには、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

実際の問題は long 型とは何の関係もありません - 少なくとも直接的には。あなたの問題は、pp数値でなければならないのに文字列であることです。問題を解決するには、それを long に変換するだけです:

pp = CLng(Request("pp"))

その後、比較は問題なく機能します。

要するに、問題は 2 つの変数を比較するときです。Eric Lippert によるこの素晴らしいブログ投稿で説明されているように、1 つの変数に文字列値が含まれ、1 つの変数に数値が含まれている場合、それらを比較すると、文字列はどの数値よりも大きくなります。常に大きくなるzzという意味の値は何ですか。pp

では、詳しい説明を。( Nilpoの助けを借りて)

VBScript では、すべての変数は実際には Variant 型です。つまり、任意の時点で任意のタイプのデータを保持でき、含まれる値のタイプを変更できます。

VBScript の比較演算子 (<、>、<>、=) は、数値の比較に使用されます。文字列は数値データ型ではないため、これらの比較演算子は、文字列を数値と比較するときに使用可能な結果を​​返すことはありません。これは、文字列に数値を含めることができないという意味ではありません。「4.56」、「4.5e3」、「fifteen」などの数値を表す数字または文字の文字列を含めることができます。このような場合、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 に答える