AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

"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 2  1 2   
stifflersmom

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 11: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
 
#2

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 11: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.609 Beiträge
 
Delphi 12 Athens
 
#3

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 11: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: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#4

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 11: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 Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
stifflersmom

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 16: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
stifflersmom

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 16:06
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;
das werde ich gleich mal ausprobieren.
  Mit Zitat antworten Zitat
stifflersmom

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 16:20
Um meinen Vorschlag mal zu konkretisieren (hoffe mal, das geht alles unter D2006):
das werde ich gleich mal ausprobieren.
Toller, kompakter Code!!

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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 16:50
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.
Ah ja, ich vergaß! Nein, dann funktioniert das so nicht. Dann muss man erst den Dezimalseparator ermitteln und dann die Tausendertrenner eliminieren. Ist dann allerdings nicht mehr so kompakt:
Delphi-Quellcode:
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;
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
stifflersmom

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 16:54
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
  Mit Zitat antworten Zitat
stifflersmom

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

AW: "Sicheres" Umwandeln von Zeichenkette in Zahl

  Alt 29. Sep 2017, 18:14
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.
Ah ja, ich vergaß! Nein, dann funktioniert das so nicht. Dann muss man erst den Dezimalseparator ermitteln und dann die Tausendertrenner eliminieren. Ist dann allerdings nicht mehr so kompakt:
Delphi-Quellcode:
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;
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.
Auf jeden Fall ist das für mich großes Kino!
Klasse Code.
Wo stehen eigentlich genau diese
Delphi-Quellcode:
  cLocales: array[0..5] of Integer
      = (
         1031, { German }
         1033, { English }
         1040, { Italian }
         1055, { Turkish }
         3082, { Spanish }
         LOCALE_USER_DEFAULT);
Länderkosntanten?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:01 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 by Thomas Breitkreuz