AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?
Thema durchsuchen
Ansicht
Themen-Optionen

Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?

Ein Thema von Kenshin4455 · begonnen am 28. Nov 2007 · letzter Beitrag vom 7. Feb 2011
Antwort Antwort
Seite 1 von 3  1 23      
Kenshin4455

Registriert seit: 28. Nov 2007
3 Beiträge
 
#1

Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?

  Alt 28. Nov 2007, 17:23
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#2

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?

  Alt 28. Nov 2007, 17:31
Ja hallo ersmal und Willkommen und so

also in Delphi selber is nichts vorhanden,
aber wieso willst due denn nicht Stück für Stück prüfen?
Bsp:
Delphi-Quellcode:
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}
PS: IN arbeitet nicht mit ganzen String, sondern nur mit ordinalen Typem wie z.B. einem einzelnem Zeichen(Char).


Alternativ könntes du natürlich auch nach etwas suchen, welches mit "großen" Zahlen zurechtkommen.
Hier im Forum suchenBigMath und Co.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Kenshin4455

Registriert seit: 28. Nov 2007
3 Beiträge
 
#3

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?

  Alt 28. Nov 2007, 18:07
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.
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?

  Alt 28. Nov 2007, 18:33
Hallo,

Zitat von Kenshin4455:
[...]es geht eher darum das die zahl auch z.b 2^100 stellen haben könnte also unendlich lang sein kann[...]
die größten mir bekannten Festplatten haben eine Kapazität von 1 Terabyte (etwa 2^40 Byte). Wie und wo speicherst du Zahlen dieser Größenordnung und Genauigkeit für die Weiterverarbeitung?

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#5

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?

  Alt 28. Nov 2007, 18:33
Unendlich lang geht nicht (irgendwann geht dir der RAM für den String aus, wo dann ab 2^30 realistisch langsam Schluß ist )

Und wie sollte denn sonst geprüft werden?
(selbst wenn es eine Funktion dafür gäbe, dann würde die ähnlich arbeiten)

Zitat von Kenshin4455:
das schluckt doch bissel an der performance.
Schlimmer wäre es wohl, wenn man den String zerlegt und versucht Stück für Stück (also sehr oft) in reelle Typen umzuwandeln.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?

  Alt 28. Nov 2007, 18:46
Zitat von Kenshin4455:
... das schluckt doch bissel an der performance.
Tipp: Erst testen, dann meckern.

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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#7

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?

  Alt 28. Nov 2007, 18:57
@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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#8

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?

  Alt 28. Nov 2007, 19:00
Zitat von Hawkeye219:
die größten mir bekannten Festplatten haben eine Kapazität von 1 Terabyte (etwa 2^40 Byte). Wie und wo speicherst du Zahlen dieser Größenordnung und Genauigkeit für die Weiterverarbeitung?
[Etwas OT]
Deshalb bin ich auch von Delphi.Win32 auf Delphi.DTM für Deterministische Turing Maschinen umgestiegen, macht die Sache gleich viel angenehmer
[/Etwas OT]
  Mit Zitat antworten Zitat
Benutzerbild von LoCrux
LoCrux

Registriert seit: 5. Mär 2007
Ort: Gwang-Yang-City
48 Beiträge
 
Delphi 2009 Enterprise
 
#9

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?

  Alt 29. Nov 2007, 01:14
Ok,

abgesehen von dem Speicherproblem 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:
// 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;
Damals war halt Rechenzeit knapp und Bit- & Boolesche-Operationen sind immer am schnellsten.
Du must also nicht deinen ganzen String duchlaufen. Definiere eine Bitmaske.

Delphi-Quellcode:
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;
Und & Vergleichsoperationen:
Im besten Fall n=2 , im schlimmsten fall n=Length(s)*2 Operationen.
“C++ is an insult to the human brain.” [Niklaus Wirth]

2B OR NOT 2B (.. THAT IS FF)
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#10

Re: Zeichenkette Prüfen ob gültige Zahl ohne Umwandeln?

  Alt 29. Nov 2007, 01:26
Zitat von himitsu:

Bsp:
Delphi-Quellcode:
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}
Hallo,

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz