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