Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Deutsche Dezimal-Zahl in englisches Format bringen (https://www.delphipraxis.net/194834-deutsche-dezimal-zahl-englisches-format-bringen.html)

Ykcim 11. Jan 2018 17:20

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

Delphi.Narium 11. Jan 2018 17:42

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Alles Wesentliche sollte hier zu finden sein: http://www.delphipraxis.net/186432-v...tsettings.html

p80286 11. Jan 2018 22:54

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Zitat:

Zitat von Ykcim (Beitrag 1390824)
Die CSV-Datei erstelle ich aus einen StringGrid (von TMS).

Wenn Du die CSV-Datei erstellst, solltest Du auch das Format im Griff haben.

Besteht nicht auch auf dem SQL-Server, die Möglichkeit, den Feldtrenner zu definieren?

Gruß
K-H

Namenloser 12. Jan 2018 04:40

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.

p80286 12. Jan 2018 07:41

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Zitat:

Zitat von Namenloser (Beitrag 1390847)
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.

Ausgerechnet der ist doch Teil von MS-SQL, da wird nicht viel anzupassen sein. Wobei ich es verwunderlich finde, das ausgerechnet er mit " nicht umgehen kann. Der CSV-Import in Access und Excel kann es auf jeden Fall.

Gruß
K-H

Jumpy 12. Jan 2018 08:40

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.

Ykcim 12. Jan 2018 09:31

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:
      //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!');
Leider wird bei der Erstellung der CSV-Datei immer noch aus 4.23 "4,23" gemacht. Hat jemand dazu eine Idee?

Vielen Dank
Patrick

galex9 12. Jan 2018 09:39

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Welche Klasse verbirgt sich unter "SG_Export" ?

Ykcim 12. Jan 2018 09:46

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Das ist das StringGrid, welches ich oben in der Procedure als Variable definiere
Delphi-Quellcode:
SG_Export: TAdvStringGrid;
und dann später zum Leben erwecke
Delphi-Quellcode:
SG_Export:= TAdvStringGrid.Create(nil);

Ykcim 12. Jan 2018 11:27

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:
   //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!');
Wenn es einen charmanteren Weg gibt, bin ich daran sehr interessiert...

Vielen Dank
Patrick

matashen 12. Jan 2018 12:16

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.

Jumpy 12. Jan 2018 12:44

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...

Delphi.Narium 12. Jan 2018 16:23

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

bcvs 16. Jan 2018 06:58

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.

ibp 16. Jan 2018 07:12

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
sind denn die Zahlen auch als numerischer Wert im AdvStringGrid definiert oder als String?

Fukiszo 16. Jan 2018 09:22

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. :)

Daniel 16. Jan 2018 09:46

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:

Caution Because this function modifies values for all applications, it should only be called by the regional and language options functionality of Control Panel, or a similar utility. If making an international change to system parameters, the calling application must broadcast the WM_SETTINGCHANGE message to avoid causing instabilities in other applications.

ibp 16. Jan 2018 10:10

AW: Deutsche Dezimal-Zahl in englisches Format bringen
 
Zitat:

Zitat von Ykcim (Beitrag 1390824)
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.

Code:
,"3,45",
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.

Whookie 16. Jan 2018 15:55

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:
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;
Dann kann man den Inhalt entsprechend abspeichern:

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.

ibp 17. Jan 2018 07:53

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 16:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf