![]() |
Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Ich hätte mal ne frage gibt es vielleicht in Delphi eine Funktion die man benutzen könnte um eine Zeichenkette zu Prüfen ohne sie umzuwandeln? und ohne das man jedes Zeichen einzeln durchsucht also mit einer Schleife?
"+242423423492849028042840928403284204832948204820 93482309483209480948903284098329084203823948092482 03" aber nicht: "-2734832748327482742374827482342842384724927498723ABA237428742837493274832749274987348723847294728372" wegen den Zeichen dazwischen. Dachte vielleicht geht das mit "in" also sprich if s in ['0'..'9'] aber das würde ja nur kucken ob die drin sind aber nich ob die aneinander hängen würden. Und ich weiß nicht wie ich alle Zeichen ausser 0..9 angeben könnnte. Weil ich brauch eine Funktion die auch bei großen Zeichenketten erkennt ob es eine gültige Zahl ist ohne das ich gleich jedes Zeichen einzeln durchsuchen. Wenns nich anders geht unterteile ich den String in mehrere Teile wo noch die Umwandlung in eine Extendet Zahl funktionieren würde sprich 20 stellen oder wieviel die fassen tut. Wäre dann zwar nicht Optimal aber noch in Ordnung. thx schonmal im vorraus |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Ja hallo ersmal und Willkommen und so :hi:
also in Delphi selber is nichts vorhanden, aber wieso willst due denn nicht Stück für Stück prüfen? Bsp:
Delphi-Quellcode:
PS: IN arbeitet nicht mit ganzen String, sondern nur mit ordinalen Typem wie z.B. einem einzelnem Zeichen(Char).
B := True;
For i := 1 to Length(S) do If not ((S[i] in ['0'..'9']) or ((i = 1) and (S[i] in ['+', '-']))) Then B := False; If B Then {istZahl} Alternativ könntes du natürlich auch nach etwas suchen, welches mit "großen" Zahlen zurechtkommen. ![]() |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
naja es geht eher darum das die zahl auch z.b 2^100 stellen haben könnte also unendlich lang sein kann da jedesmal alles durchgehen is fu find ich.... das schluckt doch bissel an der performance.
|
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Hallo,
Zitat:
Gruß Hawkeye |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Unendlich lang geht nicht (irgendwann geht dir der RAM für den String aus, wo dann ab 2^30 realistisch langsam Schluß ist :zwinker: )
Und wie sollte denn sonst geprüft werden? (selbst wenn es eine Funktion dafür gäbe, dann würde die ähnlich arbeiten) Zitat:
|
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Zitat:
Einfach mal die Zeit messen, die das Verfahren benötigt, um eine -sagen wir- Zahl mit 100.000.000 Stellen zu prüfen. Wobei der Algo von himitsu noch nicht mal sonderlich performant ist, aber darum gings ihm hier sowieso nicht, nur um eine kurze und knappe Geschichte. |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
@alzaimar: OK, ein biss PChar, statt s[...], oder gleich 'ne nette ASM-Lösung, aber es ist schon mit Sicherheit viele tausend Mal schneller als z.B. 'ne Copy-StrToFloatDef-Variante :angel:
|
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Zitat:
Deshalb bin ich auch von Delphi.Win32 auf Delphi.DTM für Deterministische Turing Maschinen umgestiegen, macht die Sache gleich viel angenehmer :mrgreen: [/Etwas OT] |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Ok,
abgesehen von dem Speicherproblem :zwinker: mal ein Loesungsvorschlag. hier sei ein Hoch auf die "Definitoere" der ASCII-Konvention. Tja, die Jungs haben sich noch was gedacht. Ich definere einfach mal, dass (wie in deinem Beispiel) in dem "Zahlenstring" NUR ZIFFERN UND BUCHSTABEN aber keine Sonderzeichen Vorkommen (<30h); + und - werden ignoriert, da als Vorzeichen immer an erster Position.;
Delphi-Quellcode:
Damals war halt Rechenzeit knapp und Bit- & Boolesche-Operationen sind immer am schnellsten.
// ADA. Quellcode-Tag zwecks Leerzeichenformatierung //
______Bit_76543210 |||||||| 0 = 30h = 00110000b 1 = 31h = 00110001b . . 9 = 39h = 00111001b @ = 40h = 01000000b A = 41h = 01000001b . . ' = 60h = 01100000b a = 61h = 01100001b . . usw.. Man richte jetzt sein Augenmerk auf Bit 6. Zahlen: Bit 6 = 0; Buchstaben: Bit 6 = 1; Grossbuchstben: Bit 5 = 0; Kleinbuchstaben Bit 5 = 1; Du must also nicht deinen ganzen String duchlaufen. Definiere eine Bitmaske.
Delphi-Quellcode:
Und & Vergleichsoperationen:
function NumStr(s:String):Boolean;
var i,l : Integer; const mask = $40; // = 01000000b begin result := true; i := 1; l := Length(s)+1; while (result and (i<l)) do begin result := (mask and ORD(s[i]))<mask; inc(i); end; end; Im besten Fall n=2 , im schlimmsten fall n=Length(s)*2 Operationen. |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Zitat:
das reicht so natürlich noch nicht - Nebenbedingungen sind z.B. dass + und - nur am Anfang auftreten dürfen und dass der String nur 1 Dezimalpunkt enthalten darf, von Exponentialdarstellungen mal abgesehen. Man muss sich also eine Zustandsmaschine schreiben, der man Zeichen für Zeichen übergibt. Gruss Reinhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz