---
title: "Det fördömda IsNumeric"
type: "forum-thread"
url: "https://www.webforum.nu/amne/asp/12919-det-fördömda-isnumeric"
topic: "ASP"
topic_url: "https://www.webforum.nu/amne/asp"
author: "jerry_beach"
published: "2001-11-29T15:30:00.000Z"
updated: "2001-11-29T18:39:00.000Z"
replies: 12
views: 243
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/asp/12919-det-fördömda-isnumeric"
---

# Det fördömda IsNumeric

## #1 — jerry_beach, 2001-11-29T15:30Z

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\]

Permalänk: https://www.webforum.nu/p/12919

## #2 — LarsG, 2001-11-29T15:43Z

```
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
```

Permalänk: https://www.webforum.nu/p/296205

## #3 — jerry_beach, 2001-11-29T16:19Z

...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?

Permalänk: https://www.webforum.nu/p/296206

## #4 — LarsG, 2001-11-29T16:31Z

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.

Permalänk: https://www.webforum.nu/p/296207

## #5 — jerry_beach, 2001-11-29T16:46Z

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

Permalänk: https://www.webforum.nu/p/296208

## #6 — LarsG, 2001-11-29T17:10Z

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.

Permalänk: https://www.webforum.nu/p/296209

## #7 — jerry_beach, 2001-11-29T17:38Z

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?

Permalänk: https://www.webforum.nu/p/296210

## #8 — LarsG, 2001-11-29T17:48Z

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.

Permalänk: https://www.webforum.nu/p/296211

## #9 — jerry_beach, 2001-11-29T17:55Z

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 :)

Permalänk: https://www.webforum.nu/p/296212

## #10 — LarsG, 2001-11-29T18:20Z

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.

Permalänk: https://www.webforum.nu/p/296213

## #11 — jerry_beach, 2001-11-29T18:26Z

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

%>
```

Permalänk: https://www.webforum.nu/p/296214

## #12 — jerry_beach, 2001-11-29T18:38Z

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 :)

Permalänk: https://www.webforum.nu/p/296215

## #13 — LarsG, 2001-11-29T18:39Z

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.

Permalänk: https://www.webforum.nu/p/296216

---

Tråden på webben: https://www.webforum.nu/amne/asp/12919-det-fördömda-isnumeric
