Überprüfung, ob String Integer

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Überprüfung, ob String Integer

Beitrag 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

Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Überprüfung, ob String Integer

Beitrag 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")
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Re: Überprüfung, ob String Integer

Beitrag von jear »

Ein reiner Test der Längen löst das Problem doch nicht. :wink:
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")
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Überprüfung, ob String Integer

Beitrag von Sicro »

jear hat geschrieben:Ein reiner Test der Längen löst das Problem doch nicht. :wink:
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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Imhotheb
Beiträge: 192
Registriert: 10.10.2014 13:14
Computerausstattung: Intel 8086, 640 KB RAM, Hercules Video Adapter, 2 x 5 1/4" 360kb Floppy, MS-DOS 3
Wohnort: Wolfenbüttel

Re: Überprüfung, ob String Integer

Beitrag 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.
weil einfach einfach einfach ist ... mach' ich es anders
Sirius-2337
Beiträge: 71
Registriert: 29.05.2010 20:55

Re: Überprüfung, ob String Integer

Beitrag 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
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Überprüfung, ob String Integer

Beitrag 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.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Antworten