webForumDet fria alternativet

Det fördömda IsNumeric

ASP

12 svar · 237 visningar · startad av jerry_beach

Medlem sedan apr. 200147 inlägg
Frågan#1

Jag befinner mig i ett stadie då jag kan vissa saker ganska bra och många andra inte ALLS! Så jag satte mig idag och tänkte fräscha upp lite gamla saker jag gjort när jag började lära mig ASP/VBScript. En tidig sak jag gjorde var ett script som skrev ut hur många ggr det skulle ta att slå t.ex. 12 med 2 6:or. Jag optimierade koden idag, och låter nu även användaren mata in egna värden för antal tärningar och antal sidor på dessa. Men så måste jag ju även kolla så att det inte matas in några tecken... Provade med IsNumeric, men får det härliga meddelandet:
Type mismatch: '[string: "f"]'

IsNumeric(MinVariabelMedTeckenI) returnerar False!

Nån som skulle kunna hjälpa mig? Och kom nu inte med en annan funktion, jag vill gärna veta varför det inte fungerar som det ska ;)

Koden:
------------------------------

<%
 Dim intAntal, intSidor, intVillHa, intUtfall, intKast

 intAntal = Trim(Request.Form("Antal"))
 intSidor = Trim(Request.Form("Sidor"))
 intUtfall = 0
 intKast = 0

 Response.Write "<form method=post action=dice.asp>"
 Response.Write "  <input type=text size=3 name=Antal value=" & intAntal & "> T "
 Response.Write "  <input type=text size=3 name=Sidor value=" & intSidor & ">"
 Response.Write "  <input type=submit value=Kasta>"
 Response.Write "</form>"

 Response.Write IsNumeric(intSidor) & " " & IsNumeric(intAntal) & "<br>"

 If intAntal = Empty Or intAntal <= 0 Or IsNumeric(intAntal) = False Or intSidor = Empty Or intSidor <= 0 Or IsNumeric(intSidor) = False Then
	Response.Write "Du har inte skickat några giltliga uppgifter ännu" 
 Else
	intVillHa = intAntal*intSidor
	Do Until intUtfall = intVillHa
		Randomize
		intUtfall = Round(Rnd * intSidor * intAntal)
		Response.Write intUtfall & "<br>"
		intKast = intKast + 1
	Loop

	Response.Write "<br>Det behövdes <b>" & intKast & "</b> kast med <b>" & intAntal & "T" & intSidor & "</b> för att slå <b>" & intVillHa & "</b>."
 End If

%>

[Redigerat av jerry_beach den 29 nov 2001]

[Redigerat av jerry_beach den 29 nov 2001]

Medlem sedan dec. 200012 464 inlägg
#2
If isEmpty(intAntal) or not isNumeric(intAntal) or isEmpty(intSidor) or not isNumeric(intSidor) then
Response.Write "Du har inte skickat några giltliga uppgifter ännu" 
Else
 intAntal = clng(intAntal)
 intSidor = clng(intSidor)
 if intAntal < 0 or intSidor < 0 then
    response.write "Värdena måste vara positiva"
 else
'allt ok
end if
end if

------------------
essentitia preter non sans multiplicandum

Medlem sedan apr. 200147 inlägg
#3

...Det funkar ju.. Men varför? Det hela känns så ologiskt. Varför ska man konvertera variablerna EFTER raden som genererar felet? Jag fattar ingenting. Och varför ska den konverteras över huvudtaget? För att den skickas som en sträng?

------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"

Medlem sedan dec. 200012 464 inlägg
#4

då du skriver

if intAntal < 0 then

så blir det en implicit konvertering av intAntal till int. Om den misslyckas så får du det felet som du angav.

------------------
essentitia preter non sans multiplicandum

Medlem sedan apr. 200147 inlägg
#5

Ursäkta om jag verkar tjatig, men nu diskuterar du med en person vars första rader VBScript bankades in med hjälp av IDGs ASP-kurs (VÄLDIGT grundläggande). Skulle du kunna utveckla det där lite grand? :)
Implicit? Men alltså.. om jag konverterar till Long precis efter jag deklarerat variablerna så får jag ett liknande felmeddelande. Varför då?

Frågar man ingenting, får man ingenting veta

------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"

Medlem sedan dec. 200012 464 inlägg
#6

Explicit konvertering:

a = 1
b = "q"
if a = clng(b) then

Implicit:

a = 1
b = "q"
if a = b then

Båda dessa kommer att ge fel.

Även om du skriver

if not isNumeric(b) or b < 0 then

så blir det fel för både villkoren kommer att utvärderas, oavsett om det första är sant eller inte.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 29 nov 2001]

Medlem sedan apr. 200147 inlägg
#7

Ahh... nu tror jag det börjar klarna :)
Förenklat: Det jag försöke göra var att jämföra två olika datatyper, en string (eller kanske variant) och en int? Jag jämförde alltså ett tecken och ett värde? Om det är så, varför kan jag inte konvertera variablerna i början av koden, efter jag ? Eller gäller konverteringen bara operationen som följer direkt efter?

------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"

Medlem sedan dec. 200012 464 inlägg
#8

Nu förstår jag inte vad du menar, t.ex. när du pratar om tecken och värde.

Alla värden är av typen variant, men man kan sätta en subtyp (int string etc). De olika subtyperna tillåter olika värdemängder och om man konverterar från en subtyp till annan så kontrolleras att värdet tillhör den tillåtna värdemängden.

------------------
essentitia preter non sans multiplicandum

[Redigerat av LarsG den 29 nov 2001]

Medlem sedan apr. 200147 inlägg
#9

Hmm.. om jag säger så här då?
1. Är anledningen till att det inte fungerade från början att jag försökte jämföra två olika datatyper som inte gick att jämföras?
2. I så fall, varför genereras ett fel om man försöker konvertera variablerna i början av koden?
3. Går det inte att jämföra en sträng som innehåller siffra, tecken (eller hur jag nu ska beskriva det) med ett värde?
Exempel:

a = "1"
b = 1

If a = 1 Then

Tack för att du tar dig tid :)

------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"

Medlem sedan dec. 200012 464 inlägg
#10

Du kan jämföra två subtyper om det går att konvertera den ena till den andra.

a = "1"
b = 1
if a = b then 'ger inget fel

a = "q"
b = 1
if b = q then 'ger fel

Exakt hur det avgörs till vilken subtyp man konverterar vet jag inte.

Personligen så tycker jag att löst typade språk är felaktigt designade.

------------------
essentitia preter non sans multiplicandum

Medlem sedan apr. 200147 inlägg
#11

Aha.. då fattar jag allt FÖRUTOM den fråga jag ställt 3 ggr (tror jag) :)
Varför fungerar det inte om man konverterar variablerna i början av koden istället?

<%
 Dim intAntal, intSidor, intVillHa, intUtfall, intKast

 intAntal = Trim(Request.Form("Antal"))
 intSidor = Trim(Request.Form("Sidor"))

' FLYTTA HIT: intAntal = CLng(intAntal)
' FLYTTA HIT: intSidor = CLng(intSidor)

 intUtfall = 0
 intKast = 0

 With Response
	.Write "<form method=post action=dice.asp>"
	.Write "  <input type=text size=3 name=Antal value=" & intAntal & "> T "
	.Write "  <input type=text size=3 name=Sidor value=" & intSidor & ">"
	.Write "  <input type=submit value=Kasta>"
	.Write "</form>"
 End With

 If isEmpty(intAntal) Or Not IsNumeric(intAntal) Or IsEmpty(intSidor) Or Not IsNumeric(intSidor) Then
	Response.Write "Du har inte skickat några giltliga uppgifter ännu" 
 Else
'KLIPP UT intAntal = CLng(intAntal)
'KLIPP UT intSidor = CLng(intSidor)
	If intAntal < 0 or intSidor < 0 then
		response.write "Värdena måste vara positiva"
	Else
		intVillHa = intAntal*intSidor
		Do Until intUtfall = intVillHa
			Randomize
			intUtfall = Round(Rnd * intSidor * intAntal)
			Response.Write intUtfall & "<br>"
			intKast = intKast + 1
		Loop
	End If

	Response.Write "<br>Det behövdes <b>" & intKast & "</b> kast med <b>" & intAntal & "T" & intSidor & "</b> för att slå <b>" & intVillHa & "</b>."
 End If

%>

------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"

[Redigerat av jerry_beach den 29 nov 2001]

Medlem sedan apr. 200147 inlägg
#12

Det var inget. Nu märkte jag att det fungerar utmärkt utan att konvertera variablerna till en annan subtyp.
Men tack ska du ha, kul att få svar så snabbt och ofta :)

------------------
"Den som bäddar vänder ofta liten tuva, om och om igen"

Medlem sedan dec. 200012 464 inlägg
#13

Om konverteringen lyckas eller inte beror enbart på vad det finns för värde i Request.Form("Antal")
Var det sker har ingen betydelse.

Om isNumeric(Request.Form("Antal")) returnerar sant så går det också bra att konvertera värdet till subtypen integer.

------------------
essentitia preter non sans multiplicandum

263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)