![]() |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Zitat:
|
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Danke erstmal für die Vorschläge!!
Prinzipell gings nur darum das ich nich alles durchgehen wollt. Grund ist das die Daten für die Verarbeitung korrekt vorliegen müssen sprich eine durchgängige Zahl ohne Buchstaben Sonderzeichen etc. dazwischen. Ich könnte den Fehlerabfanng auch in die Verarbeitung mit reinbringen das nich das ding. Dachte nur vielleicht gibts da ne andere möglichkeit weil wäre schicker wenns vorher geschieht und er nich bei der verarbeitung merkt das es an vorletzter Stelle jetzt dann noch falsch ist. Dann hätte man sich ja die vorherigen Rechnungen sparen könnnen. Naja und das mit 2^100 war wohl bissel übertrieben gesagt aber ich meinte das auch nur darauf bezogen das die Zahlen die normalen Zahlen Integer etc. sprängen würden ich kenn jetzt BigMath nich was da oben mal gennant wurde link ging da auch nicht. Müste ich jetzt mal googeln. |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Zitat:
dein Ansatz bedeutet, alle korrekten Zahlen werden komplett 2 x gelesen, nur die unkorrekten nur einmal. Wenn du nicht gerade davon ausgehst, dass die Mehrzahl fehlerhaft ist, bringt das keinen Vorteil, sondern dauert länger. Gruss Reinhard |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
@Der_Unwissende: LOGISCH! :zwinker: :roll:
|
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Zitat:
Außerdem kann der Nullterminierte String nicht maximal 2^32 (bzw. erst bei 64 Bit 2^64) sein? @Kenshin4455 Auch wenn es ein IN gäbe, glaubst du Delphi würde das per Gedankenlesen rausfinden? Es wäre dann intern ohne eigene Routine, aber eine Überprüfung würde es trotzdem geben. Und bei 4 GB wären das paar Minuten. |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
@LoCrux:
es stimmt schon das wenn Bit 6 nicht gesetzt ist daß es eine Zahl sein könnte, aber es muß dennoch keine Zahl sein (ih weiße da nur mal auf die ganzen Steuerzeichen #0..#31 hin), also einfach nur Bit 6 zu Prüfen reicht nicht aus. @Reinhard Kern: Zitat:
@Popov: hast schon Recht (es funktioniert zwar, aber wenn die 2 Assembleranweisungen je durchgang für i=1 gesparrt würde, dann wär's schon etwas optimaler) Und es wäre bestimmt nicht schlecht, wenn bei Auffinden eines unzuläßigen Zeichens die Schleife abgebrochen (siehe Break) würde :roll:
Delphi-Quellcode:
ein Punkt war zwar nicht mit in der "Aufgabenstellung" zu erkennen, aber was soll's:
B := (S <> '') and (S[1] in ['+', '-', '0'..'9']);
For i := 2 to Length(S) do If not (S[i] in ['0'..'9']) Then Begin B := False; Break; End; If B Then {istZahl}
Delphi-Quellcode:
oder
B := (S <> '') and (S[1] in ['+', '-', '0'..'9']);
B2 := True; For i := 2 to Length(S) do If not (S[i] in ['0'..'9']) Then If B2 and (S[i] = '.') and (i < Length(S) and (S[i - 1] in ['0'..'9']) and (S[i + 1] in ['0'..'9']) Then B2 := False Else Begin B := False; Break; End; If B Then {istZahl}
Delphi-Quellcode:
oder das vorherigge nochmal mit PChar
B := (S <> '') and (S[1] in ['+', '-', '0'..'9']);
B2 := True; For i := 2 to Length(S) do If not (S[i] in ['0'..'9']) Then If B2 and (S[i] = '.') and (i < Length(S)) and ((i > 2) or (S[1] in ['0'..'9'])) Then B2 := False Else Begin B := False; Break; End; If B Then {istZahl}
Delphi-Quellcode:
(ich hoffe letzteres stimmt ... hab's jetzt nur aus'm Kopf umgeschrieben und nicht getestet)
Var P: PChar;
i, i2: Integer; B, B2: Boolean; i2 := Length(S); P := PChar(S); B := (i2 <> 0) and (P^ in ['+', '-', '0'..'9']); B2 := True; For i := 2 to i2 do Begin Inc(P); If not (P^ in ['0'..'9']) Then If B2 and (P^ = '.') and (i < i2) and ((i > 2) or (S[1] in ['0'..'9'])) Then B2 := False Else Begin B := False; Break; End; End; If B Then {istZahl} und hier nochmal die PChar-Variante ohne Punkt:
Delphi-Quellcode:
Var P: PChar;
i, i2: Integer; B, B2: Boolean; i2 := Length(S); P := PChar(S); B := (i2 <> 0) and (P^ in ['+', '-', '0'..'9']); For i := 2 to i2 do Begin Inc(P); If not (P^ in ['0'..'9']) Then Begin B := False; Break; End; End; If B Then {istZahl} |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
So wäre es mit einem Automaten (Es erkennt die Floatingpoint Notation, Fixed Point und Integer mit beliebig vielen Vorzeichen), also z.B.:
"+-+-+12345,3456453345345E-9123123123"
Delphi-Quellcode:
Function IsAnyNumber(Const aValue: String): Boolean;
Const map: Array[0..5, 1..6] Of Integer = ( {0}(1, 2, -1, 0, -1, -1), {1}(1, 2, 4, -1, -1, 9), {2}(3, -1, -1, -1, -1, 9), {3}(3, -1, 4, 0, -1, 9), {4}(5, -1, -1, 4, -1, -1), {5}(5, -1, -1, -1, -1, 9) ); Var State, cChar, i: Integer; Begin State := 0; Result := False; For i := 1 To Length(aValue) Do Begin Case aValue[i] Of '0'..'9': cChar := 1; ',', '.': cChar := 2; 'E', 'e': cChar := 3; '-', '+': cChar := 4; Else cChar := 5; End; State := map[State, cChar]; If State = -1 Then Exit; End; If State <> 9 Then State := map[State, 6]; // Zustand bei Erkennen des Terminalsymbols Result := (State = 9) End; |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Zitat:
Ansonsten ok. |
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Popov, die Funktion erkennt auch Ganzzahlen, eben alle Zahlen. Äh.. oder... eh.. :gruebel: Jedenfalls hat sie das eben noch.
|
Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
@himitsu
Zitat:
Zitat:
Coole Function. :cheers: :hello: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:58 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