AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

string to Float, für lesen aus einer Datei

Ein Thema von bernhard_LA · begonnen am 17. Mär 2018 · letzter Beitrag vom 18. Mär 2018
Antwort Antwort
Seite 1 von 2  1 2      
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#1

string to Float, für lesen aus einer Datei

  Alt 17. Mär 2018, 15:00
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)) ;
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: string to Float, für lesen aus einer Datei

  Alt 17. Mär 2018, 15:27
Rein von der Lösungsmöglichkeit her würde ich es auch so machen. Statt StringReplace würde ich allerdings direkt FloatStr[DelimPos] := '.' setzen, also den Parameter als var übergeben. So sparst du dir das Rumkopieren im Speicher. Mehrere Vorkommen des Dezimalseparators innerhalb eines einzelnen Wertes sind ja eh nicht zulässig, weshalb StringReplace mit rfReplaceAll auch Overkill sein sollte.

Delphi-Quellcode:
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;
Die ganzen zusätzlichen Variablen würde ich mir auch sparen. Achso, dann musst du den StrToFloat Aufruf natürlich abändern in 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;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (17. Mär 2018 um 15:40 Uhr)
  Mit Zitat antworten Zitat
Neumann

Registriert seit: 6. Feb 2006
Ort: Moers
535 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: string to Float, für lesen aus einer Datei

  Alt 17. Mär 2018, 16:16
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
Ralf
Gruß vom Niederrhein
  Mit Zitat antworten Zitat
Benutzerbild von markus5766h
markus5766h

Registriert seit: 5. Mär 2009
Ort: Hamburg
569 Beiträge
 
Delphi XE8 Professional
 
#4

AW: string to Float, für lesen aus einer Datei

  Alt 17. Mär 2018, 19:20
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
. . . siehe Post #2 :
"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

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 . . .
Markus H.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: string to Float, für lesen aus einer Datei

  Alt 17. Mär 2018, 22:46
"Mehrere Vorkommen des Dezimalseparators innerhalb eines einzelnen Wertes sind ja eh nicht zulässig, ..."
Im obigen Beispiel fallen mir gleich 4 mögliche Lösungen ein, die ich dann abfragen bzw. auswerten müsste . . .
Ich bin der Meinung das bei dem Beispiel nur ein Dezimalseperator vorhanden ist.
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#6

AW: string to Float, für lesen aus einer Datei

  Alt 18. Mär 2018, 10:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: string to Float, für lesen aus einer Datei

  Alt 18. Mär 2018, 11:38
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;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#8

AW: string to Float, für lesen aus einer Datei

  Alt 18. Mär 2018, 11:50
So hier könnte man testen ob eine Konvertierung gelingt bevor man es konvertiert:
Oder man benutzt gleich TryStrToFloat oder Double.TryParse mit den erwarteten FormatSettings . Das hat den Nebeneffekt, daß es auch gleich konvertiert, wenn das denn möglich ist.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: string to Float, für lesen aus einer Datei

  Alt 18. Mär 2018, 15:05
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!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#10

AW: string to Float, für lesen aus einer Datei

  Alt 18. Mär 2018, 15:27
Aber wenn die Quelle gemixt ist, da hilft sowas auch nicht weiter, vermute ich
Das ist auch nicht allein aus den Daten zu ermitteln.

1.001
1,001
100,001
100.001
Schönes Beispiel. Je nach Dezimal- und Tausndertrenner sind alle vier Zahlen in beiden Systemen gültig, haben halt nur unterschiedliche Bedeutung.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:10 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