2009-10-07 16 views
15

Wewnątrz skryptu VBScript, muszę się upewnić, że użytkownik wprowadza liczbę całkowitą.VBScript: sprawdzanie, czy dane wejściowe użytkownika są liczbami całkowitymi

Oto co mam teraz:

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 

Problemem jest to, że CLng() nie sprawdzić, czy mój numer jest liczbą całkowitą: numer jest przekształcany w każdym razie.

Czy istnieje sposób sprawdzenia, czy liczba jest liczbą całkowitą?

EDIT:

Sugerowana odpowiedź nie działa dobrze dla mnie. Oto nowa wersja mojego kodu:

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 

i tu jest wyjście:

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 

Odpowiedz

11

ten jest bardzo podobny do kodu:

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 ma problem. Wpisz "12,6,14", a IsNumeric zwraca wartość "prawda" i wygeneruje wyjątek w instrukcji CLng. – LarryBud

+1

'CLng (Number) = Number' nie zadziała, ponieważ operandy mają inny typ, więc kontrola się nie powiedzie, patrz odpowiedź @ cogumel0. – ViRuSTriNiTy

3

Jeśli zrobisz coś takiego, to powinno działać:

jeśli Number = CInt (numer) Następnie

+0

Wolę używać cLong, ponieważ cInt nie obsługuje 32-bitowych liczb całkowitych! – backslash17

+0

masz rację, CLong też będzie działać. Właśnie tworzyłem szybki przykład. – kemiller2002

-4

inny sposób,

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

Co z liczbami z miejscami po przecinku? Podwaja nie są liczbami całkowitymi, ale mogą być większe od 0. – backslash17

+0

Liczby (w tym liczby całkowite) mogą być również ujemne. – Helen

0

znalazłem to prosty program do sprawdzania poprawności wartość liczbową od http://rindovincent.blogspot.com/p/vbscript-programs.html i za zgodą jestem wklejając ten sam. Mam nadzieję, że będzie to pomocne dla początkujących jak ja

<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

To rzeczywiście działa:

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 

Wcześniej problemem było to, że były porównywaniu ciąg vs liczbę całkowitą, która nigdy by ocenić wartość true.

Teraz weź łańcuch, sprawdź, czy jest on liczbowy, przekształć go w CLng(), który zwróci tylko część całkowitą liczby, przekształci ją z powrotem w ciąg znaków i na koniec porówna go z oryginalnym łańcuchem.

Jeśli wpiszesz ... "asdasD" (lub jakikolwiek inny element nieliczbowy), to nie przejdzie on kontroli "isNumeric".

Jeśli wpiszesz "10.5" (jako ciąg znaków) po przekonwertowaniu do CLng(), otrzymasz 10, po czym zostanie przekonwertowany do "10" i porównany z "10.5". Ponieważ łańcuchy nie są zgodne, oznacza to, że nie jest liczbą całkowitą.

Jeśli wpiszesz "10" przekonwertowane do CLng(), to 10, z powrotem do napisu "10", który zwraca wartość true, gdy dopasowuje ją do "10", co oznacza, że ​​jest liczbą całkowitą.

Kilka lat za późno, wiem, ale sam się nad tym zastanawiałem i byłem tym zaskoczony. Mam nadzieję, że pomoże to komuś innemu zastanawiać się jak ja.

+0

Różnica między twoją odpowiedzią a ukośnikiem odwrotnym 17 jest następująca: 'If CStr (CLng (Number)) = Number Then'. Czy wyraźna konwersja z CStr jest naprawdę potrzebna? Mam wrażenie, że VBS dokonuje dla nas niejawnej konwersji! –

+1

Tak, potrzebna jest wyraźna konwersja. Zauważ: "Wcześniej problemem było porównywanie ciągu znaków z liczbą całkowitą, która nigdy nie byłaby prawdziwa." cogumel0, dziękuję, że to wymyśliłeś! –

+0

To był jedyny przykład na tej stronie, który działał dla mnie (zaakceptowana odpowiedź nie była). Konwersja 'CStr()' wydaje się krytyczna. – gbmhunter

1

10 Odpowiedź cogumela powyżej prawie ją dostaje, ale nie udało mi się to w dziwny sposób. Odkryłem, że powróci ono do "5" (w cudzysłowie), ale nie 5 (bez cudzysłowów).Dokonując ostatecznego porównania, należy przekonwertować oryginalne wejście na ciąg, aby wszystko działało niezawodnie. Tutaj jest owinięty w estetycznym funkcji:

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 

Ja również przetestowane zero (prawda), ujemnych liczb całkowitych (prawda), jak i obecnie w cudzysłowie.

Powiązane problemy