AGB  ·  Datenschutz  ·  Impressum  







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

"Sicheres" Umwandeln von Zeichenkette in Zahl

Ein Thema von stifflersmom · begonnen am 29. Sep 2017 · letzter Beitrag vom 30. Sep 2017
Antwort Antwort
Seite 1 von 3  1 23      
stifflersmom
Online

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

"Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 07: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
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 09:16
Wirklich Delphi 2006 oder darf es auch etwas moderner sein?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 09:18
Anderer Ansatz:

CSV-Dateien mit Excel öffnen und dann mit Excelmitteln auslesen.

Dazu könnte man Excel aus Delphi heraus fernsteuern.
(Allerdings kann man da auch nicht absolut sicherstellen, dass das lokale Excel mit jeder beliebigen CSV-Datei vom Rest der Welt sicher und korrekt umgehen kann.)

Ein schon etwas älteres Tutorial ist hier zu finden: Excel mit OLE-Automation steuern

Egal was Du bei Deinem Ansatz machst und wie gut Du ihn umgesetzt bekommst. Irgendwann kommt eine Datei, die nicht passt. Murphy wird gewinnen (Im Prinzip hast Du das Problem in Deinem Kommentar schon benannt.)
  Mit Zitat antworten Zitat
stifflersmom
Online

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 09:20
Ja, zu meiner Schande mus ich gestehen, dass das größte Projekt bei uns noch in 2006 geschrieben ist.
Den Umzug zu Beerlin oder Tokyo habe ich noch nicht vollzogen...
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 09:35
Ich kenne jetzt nicht die genauen Anforderungen, aber so spontan würde ich es mit
Delphi-Quellcode:
function TryStrToFloat(const S: string; out Value: Single;
  const FormatSettings: TFormatSettings): Boolean; overload;
und verschiedenen FormatSettings versuchen. Natürlich würde die Kenntnis der Sprache vorab deutlich helfen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
stifflersmom
Online

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 10:01
Wie gesagt, das sind je nach Zulieferer die verschiedensten Sprachen Italien, Türkei, Spanien...
Wir bekommen auch Dateien aus china, aber die lassen wir mal aussen vor
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 10:06
Wie gesagt, das sind je nach Zulieferer die verschiedensten Sprachen Italien, Türkei, Spanien...
Wir bekommen auch Dateien aus china, aber die lassen wir mal aussen vor
Wer oder was generiert denn die Dateien?
Bzw.. falls ihr das Format festlegt, dann könnt ihr auch den Dezimalseparator bestimmen.
Dann muss jeder Kunde nur schauen dass er es richtig abspeichert und ihr könnt ohne Probleme alles lesen ohne 353 verschiedene Sprachen/Notationen unterstützen zu müssen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 10:30
Um meinen Vorschlag mal zu konkretisieren (hoffe mal, das geht alles unter D2006):
Delphi-Quellcode:
var
  AllFormatSettings: array of TFormatSettings;

procedure InitFormatSettings;
const
  cLocales: array[0..5] of Integer
      = (
         1031, { German }
         1033, { English }
         1040, { Italian }
         1055, { Turkish }
         3082, { Spanish }
         LOCALE_USER_DEFAULT);
var
  I: Integer;

begin
  SetLength(AllFormatSettings, Length(cLocales));
  for I := 0 to Length(cLocales) - 1 do begin
    GetLocaleFormatSettings(cLocales[I], AllFormatSettings[I]);
  end;
end;

function TryStrToFloatAll(const S: string; out Value: Double): Boolean;
var
  I: Integer;
begin
  Result := True;
  for I := 0 to Length(AllFormatSettings) - 1 do begin
    if TryStrToFloat(S, Value, AllFormatSettings[I]) then Exit;
  end;
  Result := False;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 10:34
Um meinen Vorschlag mal zu konkretisieren (hoffe mal, das geht alles unter D2006):
Ein generelles Problem bleibt aber, zumindest in der Theorie.

Im Englischen ist die Zahl 10,345 für den PC eine 10345
Im Deutschen ist die Zahl 10,345 für den PC ein 10 und ein paar Zerquetschte.

Daher kann keine Lösung garantieren, dass die Zahlen korrekt interpretiert werden, wenn der Nutzer nicht darüber wacht.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
stifflersmom
Online

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 15:06
Um meinen Vorschlag mal zu konkretisieren (hoffe mal, das geht alles unter D2006):
Ein generelles Problem bleibt aber, zumindest in der Theorie.

Im Englischen ist die Zahl 10,345 für den PC eine 10345
Im Deutschen ist die Zahl 10,345 für den PC ein 10 und ein paar Zerquetschte.

Daher kann keine Lösung garantieren, dass die Zahlen korrekt interpretiert werden, wenn der Nutzer nicht darüber wacht.

......
Ich gehe erst mal davon aus, dass Zahl mit einer 1000-er Formatierung auch mit Nachkommastellen dargestellt werden. Deshalb ah mein Ansatz, die Zeichenfolge von rechts anzugehen und je nach Position eines Zeichens, dass einem möglichen Separator entspricht, dass entweder als dezimalseparator oder Tausenderpunkt zu erkennen.
  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:31 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