Seite 1 von 1
Überprüfung, ob String Integer
Verfasst: 30.05.2015 22:50
von ProgOldie
Ich gebe in ein Stringgadget Ziffern ein. Es soll überprüft werden, ob die eingegebene Ziffernfolge Inp$ einem Wert für Integer bei 64-Bit entspricht. Dazu definiere ich :
#INTEGER_min=-9223372036854775808 : #INTEGER_max=9223372036854775807
Nun funktioniert Val(Inp$) aber nur für Quads, liefert also Unsinn, wenn die Ziffernfolge z.B. aus 30 Ziffern besteht.
Wie überprüfe ich
exakt (!), ob die Eingabe zwischen #INTEGER_min und #INTEGER_max liegt?
Übrigens habe ich das Problem mit 32/64-Bit mit folgender Compileroption gelöst:
Code: Alles auswählen
CompilerIf #PB_Compiler_OS = #PB_OS_Windows And #PB_Compiler_Processor = #PB_Processor_x86
;32 Bit Windows
#INTEGER_min=-2147483648 : #INTEGER_max=2147483647
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows And #PB_Compiler_Processor = #PB_Processor_x64
;64 Bit Windows
#INTEGER_min=-9223372036854775808 : #INTEGER_max=9223372036854775807
CompilerElse
CompilerError "Windows and 32/64 Bit only"
CompilerEndIf
Re: Überprüfung, ob String Integer
Verfasst: 31.05.2015 10:45
von matbal
Du könntest mit Strings statt Zahlen arbeiten. Ich würde zuerst die Ziffernanzahl prüfen. Und bei gleicher Ziffernanzahl würde ich nach Größe der Strings vergleichen.
Der Code funktioniert so nur mit Dezimalzahlen.
Code: Alles auswählen
CompilerIf #PB_Compiler_OS = #PB_OS_Windows And #PB_Compiler_Processor = #PB_Processor_x86
;32 Bit Windows
#INTEGER_min="-2147483648" : #INTEGER_max="2147483647"
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows And #PB_Compiler_Processor = #PB_Processor_x64
;64 Bit Windows
#INTEGER_min="-9223372036854775808" : #INTEGER_max="9223372036854775807"
CompilerElse
CompilerError "Windows and 32/64 Bit only"
CompilerEndIf
Procedure IsInteger(String$)
Protected StringLen = Len(String$)
Protected MaxLen
If Asc(String$) = '-' ; negativ
MaxLen = Len(#INTEGER_min)
If StringLen > MaxLen
ProcedureReturn #False
ElseIf StringLen < MaxLen
ProcedureReturn #True
ElseIf String$ <= #INTEGER_min
ProcedureReturn #True
EndIf
Else
MaxLen = Len(#INTEGER_max)
If StringLen > MaxLen
ProcedureReturn #False
ElseIf StringLen < MaxLen
ProcedureReturn #True
ElseIf String$ <= #INTEGER_max
ProcedureReturn #True
EndIf
EndIf
EndProcedure
Debug IsInteger("2147483647")
Re: Überprüfung, ob String Integer
Verfasst: 31.05.2015 22:00
von jear
Ein reiner Test der Längen löst das Problem doch nicht.
Nur als Denkanstoß.
Code: Alles auswählen
CompilerIf #PB_Compiler_OS = #PB_OS_Windows And #PB_Compiler_Processor = #PB_Processor_x86
;32 Bit Windows
#INTEGER_min="-2147483648" : #INTEGER_max="2147483647"
#Drunter = "-2147483649" : #Drueber = "2147483648"
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows And #PB_Compiler_Processor = #PB_Processor_x64
;64 Bit Windows
#INTEGER_min="-9223372036854775808" : #INTEGER_max="9223372036854775807"
#Drunter = "-9223372036854775809" : #Drueber = "9223372036854775808"
CompilerElse
CompilerError "Windows and 32/64 Bit only"
CompilerEndIf
Procedure IsInteger(String$)
Protected.i i
i = Val(String$)
If Str(i) = String$ : ProcedureReturn #True : EndIf
ProcedureReturn #False
EndProcedure
Debug IsInteger(#INTEGER_min)
Debug IsInteger(#INTEGER_max)
Debug IsInteger(#Drunter)
Debug IsInteger(#Drueber)
Debug IsInteger("??4748no3647")
Debug IsInteger("komische Zahl")
Debug IsInteger("4711")
Debug IsInteger("471l")
Debug IsInteger("O4711")
Re: Überprüfung, ob String Integer
Verfasst: 31.05.2015 23:27
von Sicro
jear hat geschrieben:Ein reiner Test der Längen löst das Problem doch nicht.
Deshalb macht er ja noch einen Vergleich. Schau dir seinen Code mal genauer an.
matbal hat geschrieben:Ich würde zuerst die Ziffernanzahl prüfen. Und bei gleicher Ziffernanzahl würde ich nach Größe der Strings vergleichen.
Re: Überprüfung, ob String Integer
Verfasst: 01.06.2015 05:28
von Imhotheb
Moin,
kann das im Moment nicht testen, aber eine Quad-Hilfsvariable benutzen, den Wert prüfen und dann dem Int zuweisen oder Fehler anzeigen.
Re: Überprüfung, ob String Integer
Verfasst: 01.06.2015 06:50
von Sirius-2337
Oder so vielleicht..
Code: Alles auswählen
InputInt$ = "2147483649"
a.i = Val(InputInt$)
Debug Str(a)
If Str(a) = InputInt$
Debug "Ok"
Else
Debug "Nicht Ok"
EndIf
Re: Überprüfung, ob String Integer
Verfasst: 01.06.2015 07:39
von ProgOldie
Vielen Dank an alle erst einmal. Ich habe aus den Antworten zwei grundlegende Lösungsideen ins Auge gefasst:
1. Man lässt die testweise Umwandlung in eine Quad erst 'mal weg und vergleicht als Strings. Um diesen Vergleich durchführen zu können, muss man natürlich die Intervallgrenzen als String festsetzen, die Eingabe ist es ja schon. Dann nimmt man eine Stringlänge, die deutlich größer ist als die max. Ziffernzahl für Quads, sagen wir 22. Nun füllt man - unter Berücksichtigung eines eventuellen Vorzeichens- die zu vergleichenden Werte von links mit Nullen auf. Dann müsste der Stringvergleich funktionieren.
2.Die überraschend kurze Lösung von Sirius-2337. Wenn man einem Quad-Wert mit Val() eine zu große Zahl zuweist wird wohl eine Art Überlauf erfolgen,d.h. es wird in jedem Fall ein Wert zurückgereicht.
Ich werde mich, weils heute zeitlich knapp ist, 'mal detailliert mit beiden Strategien beschäftigen und dann berichten.