![]() |
string to Float, für lesen aus einer Datei
ich muss Zahlen aus einer Datei einlesen, die entweder mit deutschem (1,234) oder amerikanischem Decimalsparator (1.234) erstellt wurden.
Die Anwendung soll auf Windows Systemen mit Sprache Deutsch oder Englisch dann laufen und die eingelesenen Strings immer richtig interpretieren Gibt es hier eine bessere Lösung als meine ?
Delphi-Quellcode:
function ChangeLocalFloatStr (FloatStr : String ) : String;
var usedDecimalSeparator : Char ; NOTusedDecimalSeparator : Char ; begin // egal was der user eingestellt hat ...... usedDecimalSeparator := TFormatsettings.Invariant.DecimalSeparator; if usedDecimalSeparator=',' then NOTusedDecimalSeparator:='.' else NOTusedDecimalSeparator :=','; if pos (usedDecimalSeparator , FloatStr) > 0 then begin result := FloatStr; end else begin result := stringreplace(FloatStr, NOTusedDecimalSeparator , usedDecimalSeparator, [rfReplaceAll, rfIgnoreCase]); end; end; Aufruf :
Delphi-Quellcode:
a : real;
astr : String ; a := FloatToStr( ChangeLocalFloatStr (astr)) ; |
AW: string to Float, für lesen aus einer Datei
Rein von der Lösungsmöglichkeit her würde ich es auch so machen. Statt
Delphi-Quellcode:
würde ich allerdings direkt
StringReplace
Delphi-Quellcode:
setzen, also den Parameter als
FloatStr[DelimPos] := '.'
Delphi-Quellcode:
übergeben. So sparst du dir das Rumkopieren im Speicher. Mehrere Vorkommen des Dezimalseparators innerhalb eines einzelnen Wertes sind ja eh nicht zulässig, weshalb
var
Delphi-Quellcode:
mit
StringReplace
Delphi-Quellcode:
auch Overkill sein sollte.
rfReplaceAll
Delphi-Quellcode:
Die ganzen zusätzlichen Variablen würde ich mir auch sparen. Achso, dann musst du den
function ChangeLocalFloatStr(var FloatStr: String): String;
var I: Integer; begin I := Pos(',', FloatStr); if (I > 0) then begin FloatStr[I] := TFormatSettings.Invariant.DecimalSeparator; end; end;
Delphi-Quellcode:
Aufruf natürlich abändern in
StrToFloat
Delphi-Quellcode:
.
StrToFloat(FloatStr, TFormatSettings.Invariant)
Alternativ alles ganz kompakt (dann sparst du dir beim Aufrufen die zusätzliche Variable):
Delphi-Quellcode:
function LocalStrToFloat(FloatStr: String): Double;
var I: Integer; begin I := Pos(',', FloatStr); if (I > 0) then begin FloatStr[I] := TFormatSettings.Invariant.DecimalSeparator; end; Result := StrToFloat(FloatStr, TFormatSettings.Invariant); end; |
AW: string to Float, für lesen aus einer Datei
Es gibt dann aber noch folgende Schreibweise für Zahlen, die berücksichtigt werden müssten:
10,000,000.34 oder ev. auch 10.000.000,34 |
AW: string to Float, für lesen aus einer Datei
Zitat:
"Mehrere Vorkommen des Dezimalseparators innerhalb eines einzelnen Wertes sind ja eh nicht zulässig, ..." bei "10.000.000,34" könnt' ich mir glatt überlegen, ob dies eine IP-Adresse sein soll :-D aber mal ernsthaft : ich hab' solche Schreibweisen mit mehreren Separatoren auch schon gesehen und dann gegrübelt, was das denn nun sein soll - man kann von einer Software nicht erwarten, dass sie die Absicht oder Meinung desjenigen errät, der sich bei der Schreibweise von Zahlenwerten nicht an gängige Normen hält. Im obigen Beispiel fallen mir gleich 4 mögliche Lösungen ein, die ich dann abfragen bzw. auswerten müsste . . . |
AW: string to Float, für lesen aus einer Datei
Zitat:
Als Lösung für so eine Situation schwebt mir so etwas vor: String in einer Schleife nach "." und "," suchen lassen, das zuletzt gefundene wird als Seperator genommen, im gleichen Atemzug werden die 100'er Markierungen entfernt. |
AW: string to Float, für lesen aus einer Datei
Und was passiert hierbei?
1.001 1,001 100,001 100.001 Was ist jetzt Eintausendeins und was Einskommanullnulleins? Was ist Einhundertkommanullnulleins und was Einhunderttausendeins? Für eine sichere Erkennung des Dezimalseparators benötigt man mindestens zwei Tausenderseperatoren und damit Werte über einer Million. |
AW: string to Float, für lesen aus einer Datei
Ich verstehe was Du meinst, da wird es schnell chaotisch.
Na dann Fragen wir doch mal den TE ob 1000'er Markierungen überhaupt vorliegen. So hier könnte man testen ob eine Konvertierung gelingt bevor man es konvertiert:
Code:
funtion TestFloatStr ( S : String ) : Boolean;
begin try StrToFloat(s); // normal aufrufen result := true; // scheint keine Exception auszulösen also ist Wert gut except result := false; // oh-oh, fehler! end; end; |
AW: string to Float, für lesen aus einer Datei
Zitat:
Delphi-Quellcode:
oder
TryStrToFloat
Delphi-Quellcode:
mit den erwarteten
Double.TryParse
Delphi-Quellcode:
. Das hat den Nebeneffekt, daß es auch gleich konvertiert, wenn das denn möglich ist.
FormatSettings
|
AW: string to Float, für lesen aus einer Datei
Das mit dem Double.TryParse war mir neu und klingt interessant, ich habe jetzt ein wenig darüber gelesen, per CultureInfo/InvariantCulture kann man das "." und "," Problem in den Griff bekommen. Aber wenn die Quelle gemixt ist, da hilft sowas auch nicht weiter, vermute ich, Danke für den Tipp!
|
AW: string to Float, für lesen aus einer Datei
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 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