2009-10-07 13 views
15

All'interno di un VBScript, ho bisogno di assicurarmi che l'utente inserisca un intero.VBScript: verifica se l'input dell'utente è un numero intero

Ecco quello che ho adesso:

WScript.Echo "Enter an integer number : " 
Number = WScript.StdIn.ReadLine 
If IsNumeric(Number) Then 
    ' Here, it still could be an integer or a floating point number 
    If CLng(Number) Then 
     WScript.Echo "Integer" 
    Else 
     WScript.Echo "Not an integer" 
    End If 
End if 

Il problema è che CLng() non verifica se il mio numero è un numero intero: il numero viene convertito in ogni caso.

C'è un modo per verificare se un numero è un numero intero?

EDIT:

La risposta suggerita non funziona come bene per me. Ecco una nuova versione del mio codice:

WScript.Echo "Enter an integer number : " 
Number = WScript.StdIn.ReadLine 
If IsNumeric(Number) Then 
    ' Here, it still could be an integer or a floating point number 
    If Number = CLng(Number) Then 
     WScript.Echo "Integer" 
    Else 
     WScript.Echo "Not an integer" 
    End If 
End if 

e qui è l'output:

U:\>cscript //nologo test.vbs 
Enter an integer number : 
12 
Not an integer 

U:\>cscript //nologo test.vbs 
Enter an integer number : 
3.45 
Not an integer 

risposta

11

Questo è molto simile al codice:

WScript.Echo "Enter an integer number : " 
Number = WScript.StdIn.ReadLine 
If IsNumeric(Number) Then 
    ' Here, it still could be an integer or a floating point number 
    If CLng(Number) = Number Then 
     WScript.Echo "Integer" 
    Else 
     WScript.Echo "Not an integer" 
    End If 
End If 
+0

IsNumeric ha un problema. Immettere "12,6,14" e IsNumeric restituisce true e genererà un'eccezione nell'istruzione CLng. – LarryBud

+1

'CLng (Number) = Number' non funzionerà in quanto gli operandi hanno un tipo diverso, quindi il controllo fallirà, vedere la risposta di @ cogumel0. – ViRuSTriNiTy

3

Se fate qualcosa di simile, dovrebbe funzionare:

se Number = CInt (Numero) Poi

+0

Preferisco usare cLong perché cInt non supporta interi a 32 bit! – backslash17

+0

hai ragione anche CLong funzionerà. Stavo solo creando un rapido esempio. – kemiller2002

-4

un altro modo,

if number > 0 then 
... 
end if 
+0

E i numeri con decimali? I doppi non sono numeri interi ma possono essere maggiori di 0. – backslash17

+0

Anche i numeri (compresi i numeri interi) possono essere negativi. – Helen

0

ho trovato questo semplice programma per convalidare il valore numerico da http://rindovincent.blogspot.com/p/vbscript-programs.html e con il permesso io sono incollando lo stesso. Spero che sarà utile per i principianti come me

<HTML> 
<HEAD><TITLE>Simple Validation</TITLE> 
<SCRIPT LANGUAGE="VBScript"> 
<!-- 
Sub Submit_OnClick 
    Dim TheForm 
    Set TheForm = Document.ValidForm 
    If IsNumeric(TheForm.Text1.Value) Then 
    If TheForm.Text1.Value < 18 Or TheForm.Text1.Value > 40 Then 
     MsgBox "Age must be above 18" 
    Else 
     MsgBox "Thank You" 
    End If 
    Else 
    MsgBox "Please enter a numeric value" 
    End If 
End Sub 
--> 
</SCRIPT> 
</HEAD> 
<BODY> 
<H3>Simple Validation</H3><HR> 
<FORM NAME="ValidForm"> 
Enter your age: 
<INPUT NAME="Text1" TYPE="TEXT" SIZE="2"> 
<INPUT NAME="Submit" TYPE="BUTTON" VALUE="Submit"> 
</FORM> 
</BODY> 
</HTML> 
13

Questo potrà mai funzionare:

WScript.Echo "Enter an integer number : " 
Number = WScript.StdIn.ReadLine 
If IsNumeric(Number) Then 
    ' Here, it still could be an integer or a floating point number 
    If CStr(CLng(Number)) = Number Then 
     WScript.Echo "Integer" 
    Else 
     WScript.Echo "Not an integer" 
    End If 
End If 

In precedenza, il problema era che si stava confrontando una stringa vs un numero intero che non sarebbe mai valutata come vera.

Ora, prendi una stringa, controlla se è numerica, trasformala in CLng() che restituisce solo la parte intera del numero, la trasforma in una stringa e infine la confronta con la stringa originale.

Se si immette ... "asdasD" (o qualsiasi altra cosa non numerica) non passa il controllo "isNumeric".

Se si immette "10.5" (come stringa) quando convertito in CLng() si ottiene 10 quando viene convertito in "10" e confrontato con "10.5". Poiché le stringhe non corrispondono, si dice che non è un numero intero.

Se si immette "10" convertito in CLng() è 10, torna alla stringa è "10" che restituisce un valore true quando lo si confronta con "10", ovvero è un numero intero.

Pochi anni fa, lo so, ma mi stavo osservando da solo e mi sono lasciato perplesso. Spero che aiuti chiunque altro a chiedersi in giro come me.

+0

la differenza tra la tua risposta e il backslash17 è questa riga: 'Se CStr (CLng (numero)) = Numero Then'. La conversione esplicita con CStr è davvero necessaria? Ho la sensazione che VBS stia facendo la conversione implicita per noi! –

+1

Sì, è necessaria la conversione esplicita. Nota: "In precedenza, il problema era che stavi confrontando una stringa con un intero che non sarebbe mai stato valutato come vero." cogumel0, grazie per aver capito questo! –

+0

Questo era l'unico esempio su questa pagina che ha funzionato per me (la risposta accettata no). La conversione di 'CStr()' sembra fondamentale. – gbmhunter

1

La risposta di cogumel in alto quasi lo ottiene, ma mi ha fallito in modo strano. Ho scoperto che sarebbe tornato true per "5" (tra virgolette), ma non per 5 (senza virgolette).Quando si effettua il confronto finale è necessario convertire anche l'input originale in stringa, per far funzionare tutto in modo affidabile. Qui è avvolto in una funzione ordinata:

public function is_integer(input) 
    is_integer = false 
    If IsNumeric(input) Then 
     If CStr(CLng(input)) = CStr(input) Then is_integer = true 
    End If 
end function 

Ho anche provato questo con zero (vero), interi negativi (veri), sia dentro che fuori di virgolette.

Problemi correlati