Einzelnen Beitrag anzeigen

stifflersmom

Registriert seit: 8. Dez 2005
Ort: 24994 Holt
379 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

"Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 08:58
Moin,

ivh muss relativ häufig Daten aus CSV-Dateien einlesen, bzw. die User bei uns im Haus bekommen Exceltabellen aus den unterschedlichsten Ländern und da ist eine willkürliche Formatierung von Zahlen fast selbstverständlich.
Ich habe mir gerade eine kleine Hilfsfunktion geschrieben, die zumindest für deutsche und englische Formatierungen funktionieren sollte.
Ich hätte gerne noch ein paar Ideen bzw. Vorschläge von euch, wie das ganze vielleicht noch umfassender werden kann, ohne gleich dafür einen zig-tausend Zeilen Block zu erstellen...

Delphi-Quellcode:
function SaveStringTofloat(aString: string): Double;
const
  Kickchar = ' €$';
  Sepchar = ',.';
var
  i, y: Integer;
  sLang: string;
  dezSep: char;
begin
  Result := 0;
  y := 0;
  sLang := '';
  // Festgelegten Dezimalseparator merken
  dezSep := DecimalSeparator;
  try
    if aString <> 'then
      begin
        // für die Umwandlung den '.' als Dezimalseparator festlegen
        DecimalSeparator := '.';
        // Zuerst alle Falschzeichen raus
        for i := 1 to length(Kickchar) do
          aString := StringReplace(aString, KickChar[i], '', [RfReplaceAll]);

        for i := Length(aString) downto 1 do
          begin
            // die übergebene Zeichenkette von rechts aufdröseln
            // und die Anzahl der Zeichen merken, da der Dezimalseparator eigentlich nicht
            // weiter als vier zeichen von rechts vorhanden sein sollte
            // Ok, bei mehr als drei Nachkommastellen fahren wir gegen sie Wand... krach, bumms, quietsch
            inc(y);
            // mögl. Dezimalseparator gefunden
            if pos(aString[i], SepChar) > 0 then
              begin
                if (y <= 4) and (sLang = '') then
                  begin
                    if aString[i] = ',then
                      sLang := 'de'
                    else
                      sLang := 'en';
                  end;
                // Bei mehr als 4 Stellen von rechts und keinem erkanntem Dezimalseparator bisher
                // wird es wohl eine 1000er-Formatierung sein
                if (y > 4) and (sLang = '') then
                  begin
                    if aString[i] = '.then
                      slang := 'de'
                    else
                      sLang := 'en';
                  end;
              end;
          end;
        if sLang <> 'then
          begin
            if (slang = 'de') then
              begin
                // Deutsch: '.' als 1000-er Formatierung entfernen
                // Dezimalseparator wird auf '.' ersetzt
                aString := StringReplace(aString, '.', '', [rfReplaceAll]);
                aString := StringReplace(aString, ',', '.', [rfReplaceAll]);
              end
            else
              // kein deutsch, also ',' als 1000-er Formatierung entfernen
              aString := Stringreplace(aString, ',', '', [rfReplaceAll]);
          end;
        result := StrTofloat(astring);
      end;

  finally
    DecimalSeparator := dezSep;
  end;
end;
Moin
  Mit Zitat antworten Zitat