![]() |
AW: "Sicheres" Umwandeln von Zeichenkette in Zahl
Zitat:
|
AW: "Sicheres" Umwandeln von Zeichenkette in Zahl
Zitat:
Unsere Disponenten bekommen halt in den unterschiedlichsten Art und Weisen ihre Preislisten von den Lieferanten zugeschickt. Mal als Excel, mal als CSV. Diejenigen, die diese Dateien definieren, sind meistens nie die IT-Abteilung sondern Kaufleute, und Formate mit denen abzusprechen funktioniert meist nicht. |
AW: "Sicheres" Umwandeln von Zeichenkette in Zahl
Zitat:
Jo, funktioniert auch in 2006. Nur ist das Problem der 1000-er Formatierung damit nicht erschlagen. Eine Test mit 1.024,23 ergibt dann ein False mit einer 0 als Ergebnis. |
AW: "Sicheres" Umwandeln von Zeichenkette in Zahl
Zitat:
Delphi-Quellcode:
Wenn sicher ist, daß nur Punkt und Komma als Separatoren auftreten können, dann ließe sich der Code natürlich auch etwas schlanker gestalten. Ich habe mir aber jetzt die Settings der einzelnen Länder nicht angeschaut.
function TryStrToFloatAll(const S: string; out Value: Double): Boolean;
var sep: set of Char; dez: Char; I: Integer; begin Result := False; { collect possible decimal separators } sep := []; for I := 0 to Length(AllFormatSettings) - 1 do begin Include(sep, AllFormatSettings[I].DecimalSeparator); end; { determine current decimal separator } dez := #0; for I := Length(S) downto 0 do begin if S[I] in Sep then begin dez := S[I]; Break; end; end; { no decimal separator => wrong input. Try StrToInt instead. } if dez = #0 then Exit; Result := True; for I := 0 to Length(AllFormatSettings) - 1 do begin { try all formatsettings with found decimal separator } if dez = AllFormatSettings[I].DecimalSeparator then begin { eliminate thousand separator before conversion } if TryStrToFloat(StringReplace(S, AllFormatSettings[I].ThousandSeparator, '', [rfReplaceAll]), Value, AllFormatSettings[I]) then Exit; end; end; Result := False; end; |
AW: "Sicheres" Umwandeln von Zeichenkette in Zahl
Hallo Uwe,
von dem Code bin ich auf jeden Fall erst Mal beeindruckt. Den werde ich mir gleich mal genauer zu Gemüte führen. Danke erst mal |
AW: "Sicheres" Umwandeln von Zeichenkette in Zahl
Mal 'ne etwas altertümliche Idee:
Es gibt doch die Prozedure VAL. Könnte man damit nicht "austesten"?
Delphi-Quellcode:
var
I : Float; // oder sowas Code: Integer; begin { Text aus Zeichenfolge übernehmen } Val(Zeichenfolge, I, Code); { Fehler bei der Konvertierung in Zahl? } if Code <> 0 then begin // In Code haben wir jetzt die Position des Zeichens, // dass eine Konvertierung in eine Zahl verhindert. // Dieses Zeichen könnte man jetzt auswerten, um zu erfahren // ob es der Tausendertrenner oder der Dezimalseparator ist. // Einen derartigen Test müsste man dann (hoffentlich nur) für die erste Zeile // einer CSV-Datei machen und könnte damit ermitteln, welche Zeichen // zu tauschen sind. end; end; |
AW: "Sicheres" Umwandeln von Zeichenkette in Zahl
Zitat:
ein Test mit 1.024,15 ergibt die Fehlerposition '6', das bedeutet dann, erst alle Punkte zu entfernen und anschließend eine Umwandlung des Kommas in einen Punkt. Ja, auch as funktioniert dann. |
AW: "Sicheres" Umwandeln von Zeichenkette in Zahl
Zitat:
Klasse Code. Wo stehen eigentlich genau diese
Delphi-Quellcode:
Länderkosntanten?
cLocales: array[0..5] of Integer
= ( 1031, { German } 1033, { English } 1040, { Italian } 1055, { Turkish } 3082, { Spanish } LOCALE_USER_DEFAULT); |
AW: "Sicheres" Umwandeln von Zeichenkette in Zahl
Ok, das Problem ist aber, dass man dann zwar weiß, wo der erste Fehler ist, aber das andere Zeichen quasi erraten muss.
Konkret: bei 1.024,15 und Fehler beim , sagt ja nicht, dass wir nach 'nem . suchen müssen, um ihn vorher zu entfernen. Hier ist ja irgendwie auch noch raten angesagt. So gut war meine Idee dann auch wieder nicht, da immernoch interpretierbare Unwägbarkeiten übrigbleiben :-( Das ginge nur dann verlässlich, wenn man definitiv weiß, das nur . und , als Problemfälle in Frage kommen, man nur nicht weiß, in welcher Reihenfolge. Kann man sicherstellen, dass immer dann, wenn der Fehler bei einem , auftritt, der . zu entfernen ist und das , durch einen . zu ersetzen und im umgekehren Fall bei einem Fehler bei einem . das , zu entfernen ist und der . durch ein , zu ersetzen ist, mag das angehen. Können aber auch noch andere Alternativen (wobei mir keine einfällt) bestehen, wird's schon wieder unsicher. |
AW: "Sicheres" Umwandeln von Zeichenkette in Zahl
Zitat:
Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:20 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