Deutsche Dezimal-Zahl in englisches Format bringen
Hallo Zusammen,
ich muss eine große Datenmenge, die in einer Procedure bearbeitet wird, regelmäßig in einen MySQL-Server schieben. Dazu benutze ich eine CSV-Datei und den "Load Data InFile" Befehl. Die CSV-Datei erstelle ich aus einen StringGrid (von TMS). Das Problem ist, dass mein Delphi auf das deutsche Dezimal-Format (1.000,00) und der MySQL-Server auf dem englischen (1,000.00). Ich habe in der Doku gelesen, dass das Dezimal-Format des StringGrids aus den TFormatSettings kommt. Kann mir jemand sagen, wie ich die TFormatSettings umstellen kann, damit das StringGrid mit dem englischen Format arbeitet und dann hoffentlich die CSV-Datei korrekt erstellt wird. Im Moment wird die Dezimalzahl nämlich mit Hochkommas gekapselt ("3,45"), das die CSV das Komma als Seperator verwendet. Das hat zur Folge, dass beim "Load Data InFile" Befehl ab dem Komma abgeschnitten wird. Vielen Dank Patrick |
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Alles Wesentliche sollte hier zu finden sein: http://www.delphipraxis.net/186432-v...tsettings.html
|
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Zitat:
Besteht nicht auch auf dem SQL-Server, die Möglichkeit, den Feldtrenner zu definieren? Gruß K-H |
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Das würde dir doch gar nichts bringen, weil die englische Darstellung immer noch Kommata enthält. Die einzige Lösung ist, deinen CSV-Parser anzupassen, sodass er mit "" umgehen kann.
|
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Zitat:
Gruß K-H |
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Ich mag mich ja täuschen, aber sinnvollerweise würde man den 1.000der Punkt nicht bei so einer Importdatei liefern, sondern nur den Dezimaltrenner. Dementsprechend wäre nur ein Punkt in der englischen Darstellung.
|
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Hallo Zusammen,
vielen Dank für die Antworten. Ich habe mir den anderen Beitrag durchgelesen und versucht für mich anzuwenden - leider ohne Erfolg. Nachstehend mein Code:
Delphi-Quellcode:
Leider wird bei der Erstellung der CSV-Datei immer noch aus 4.23 "4,23" gemacht. Hat jemand dazu eine Idee?
//CSV-Datei für den UpLoad erstellen
System.SysUtils.FormatSettings.DecimalSeparator := '.'; //Hier stelle ich das Setting um Application.UpdateFormatSettings := false; FillAdvGrid(SG_Export, ColsAG, RowsAG); //Hier wird das temproäre StringGrid befüllt WriteFile('as400'); FCSVPfad:=FCSVPfad+'AS400UPLOADFILE.CSV'; SG_Export.SaveToCSV(FCSVPfad); //Hier wird die CSV-Datei erstellt //CSV-Datei hochladen LoadData(FCSVPfad, 'as400temp'); //Hier wird die CSV-Datei in den MySQL-Server hochgeladen Application.UpdateFormatSettings := true; //Hier stelle ich das Setting wieder um System.SysUtils.FormatSettings.DecimalSeparator := ','; //CSV-Datei löschen if not DeleteFile(FCSVPfad) then ShowMessage('Datei "'+FCSVPfad+'" konnte nicht gelöscht werden!'); Vielen Dank Patrick |
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Welche Klasse verbirgt sich unter "SG_Export" ?
|
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Das ist das StringGrid, welches ich oben in der Procedure als Variable definiere
Delphi-Quellcode:
und dann später zum Leben erwecke
SG_Export: TAdvStringGrid;
Delphi-Quellcode:
SG_Export:= TAdvStringGrid.Create(nil);
|
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Also so könnte man es in diesem Falle lösen - allerdings ist das keine gute Lösung...
Ich ändere das Dezimalkennzeichen "manuell" von Komma auf Punkt in einer For-Schleife...
Delphi-Quellcode:
Wenn es einen charmanteren Weg gibt, bin ich daran sehr interessiert...
//CSV-Datei für den UpLoad erstellen
FillAdvGrid(SG_Export, ColsAG, RowsAG); WriteFile('as400'); FCSVPfad:=FCSVPfad+'AS400UPLOADFILE.CSV'; //decimalZahl von deutsch nach englisch ändern for I := 0 to SG_Export.RowCount -1 do begin SG_Export.Cells[21,I]:=StringReplace(SG_Export.Cells[21,I],',','.',[rfIgnoreCase, rfReplaceAll]); end; SG_Export.SaveToCSV(FCSVPfad); //CSV-Datei hochladen LoadData(FCSVPfad, 'as400temp'); //CSV-Datei löschen if not DeleteFile(FCSVPfad) then ShowMessage('Datei "'+FCSVPfad+'" konnte nicht gelöscht werden!'); Vielen Dank Patrick |
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Und warum nimmst du nicht die Formatsettings
ALT: Decimalseperator:='.'; aktuelles Delphi Formatsettings.decimalseparator:='.' ThousandSeparator gibt die Tausendertrennzeichen an. |
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Was macht denn FillAdvGrid? Wenn du da das StringGrid manuell irgendwie befüllst, kannst du dass doch da ändern. Wie der Name schon sagt sind im StringGrid nur noch Strings und das wird halt so exportiert, wie es im StringGrid steht.
Dementsprechend (je nachdem was FillAdvGrid macht/ist) sind daher auch die FormatSettings Latte... |
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Wie die CSV entsteht, ist wohl nur dort bestimmt: SG_Export.SaveToCSV
Ohne den Quelltext und / oder einer genauen Beschreibung dessen, wird es beim Raten bleiben. Innerhalb dieser Routine sind höchstwahrscheinlich die FormatSettings zu ändern (oder hat die Komponenten bereits entsprechende Attribute und / oder Methoden? Ausführliche Doku zum TAdvStringGrid |
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Ich würde den CSV-Export nicht von dem ADVGrid machen lassen. In deinem FillAdvGrid gehst du doch wahrscheinlich deine ganzen Daten durch. Dann kannst du da doch auch gleich die CSV schreiben. Dann hast du volle Kontrolle darüber, was da rein kommt und bist nicht auf die Export-Routine des Grid angewiesen.
|
AW: Deutsche Dezimal-Zahl in englisches Format bringen
sind denn die Zahlen auch als numerischer Wert im AdvStringGrid definiert oder als String?
|
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Hallo, ich hatte mal ein ähnliches problem,
und hab das übel an der wurzel gepackt. Der code ändert für das ganze system die interpretierung/darstellung der trennzeichen. hier delphi 7 kompatibler code, ich hoff es hilft. edited: hab den source entfernt da er, wie oben beschrieben "für das ganze system" war und nicht für dein lokales problem. Bei Interesse, einfach nachfragen, in den situation wo ich es brauchte, und nach bearbeitung auch wieder zurückstellte, half mir mein code aus der patsche, da mein übel = das system war. ich nutzte diesen code in batch dateien. egal. :) |
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Bloß nicht!
Dir fehlt - bei allem Respekt - die nötige Erfahrung, um ein Übel an der Wurzel zu packen, ohne selbst das nächstgrößere Übel darzustellen. Du änderst systemweite Einstellungen und ziehst damit für ein lokales Problem in Deiner Anwendung andere Programme in Mitleidenschaft, die dieses Problem ggf. gar nicht haben. MNSDN schreibt zu "SetLocaleInfo()" ausdrücklich: Zitat:
|
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Zitat:
Code:
ist doch das richtige CSV Format für das Zahlenformat 3,35. Ich vermute, dass das Problem eher bei der Methode "Load Data InFile" ein Problem vorliegt.
,"3,45",
|
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Das Problem liegt darin, das die SaveToCSV Funktion nicht wirklich "weiß" welche Daten in den Zellen stehen und sie daher einfach so abspeichert wie sie (in Stringform) eben vorliegen.
Wenn das Grid wie folgt befüllt wird (stark vereinfacht, statt FillAdvGrid):
Delphi-Quellcode:
Dann kann man den Inhalt entsprechend abspeichern:
procedure DemoFill;
var iy: Integer; ix: Integer; LFmt: TFormatSettings; begin LFmt := TFormatSettings.Create; LFmt.DecimalSeparator := '.'; for iy := 0 to AGd.RowCount-1 do begin for ix := 0 to AGd.ColCount-1 do begin AGd.Cells[ix,iy] := Format('%.6f', [ Random], LFmt); end; end; end;
Delphi-Quellcode:
AGd.Delimiter := ',';
// AGd.QuoteEmptyCells := FALSE; // leere Zellen nicht quoten AGd.SaveToCSV('D:\test.csv'); Nachteil, auch die Darstellung am Bildschirm ist dann in diesem Format. |
AW: Deutsche Dezimal-Zahl in englisches Format bringen
Code:
AdvStringgrid.ints[col,row] := 123; // > csv = ... ,123, ...
AdvStringgrid.floats[col,row] := 123.456; // > csv = ... ,123.456, ... AdvStringgrid.cells[col,row] := "123.456"; // // > csv = ...,"123.456",... immer Strings! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 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