diff --git a/source/const.inc b/source/const.inc index ddbb2dca..2ecae042 100644 --- a/source/const.inc +++ b/source/const.inc @@ -140,6 +140,8 @@ const REGNAME_CSV_TERMINATOR = 'CSVTerminator'; DEFAULT_CSV_TERMINATOR = '\r\n'; REGNAME_CSV_ESCAPER = 'CSVImportFieldEscaperV2'; + REGNAME_EXPORT_LOCALENUMBERS = 'ExportLocaleNumberFormats'; + DEFAULT_EXPORT_LOCALENUMBERS = False; REGNAME_CSV_FILENAME = 'loadfilename'; REGNAME_CSV_ENCLOPTION = 'CSVImportFieldsEnclosedOptionallyV2'; REGNAME_CSV_IGNORELINES = 'CSVImportIgnoreLines'; diff --git a/source/helpers.pas b/source/helpers.pas index a72e0a82..e29868eb 100644 --- a/source/helpers.pas +++ b/source/helpers.pas @@ -902,6 +902,9 @@ begin Data := Grid.Text[Node, i]; // Handle nulls. if GridData.Rows[Node.Index].Cells[i].IsNull then Data := TEXT_NULL; + // Unformat numeric values + if (GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal]) and (not Mainform.prefExportLocaleNumbers) then + Data := UnformatNumber(Data); // Escape HTML control characters in data. Data := htmlentities(Data); tmp := tmp + ' ' + Data + '' + CRLF; @@ -997,8 +1000,9 @@ begin Data := Grid.Text[Node, i]; // Remove 0x. if GridData.Columns[i].DatatypeCat = dtcBinary then Delete(Data, 1, 2); - // Unformat float values - if GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal] then Data := UnformatNumber(Data); + // Unformat numeric values + if (GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal]) and (not Mainform.prefExportLocaleNumbers) then + Data := UnformatNumber(Data); // Escape encloser characters inside data per de-facto CSV. Data := WideStringReplace(Data, Encloser, Encloser + Encloser, [rfReplaceAll]); // Special handling for NULL (MySQL-ism, not de-facto CSV: unquote value) @@ -1075,8 +1079,9 @@ begin Data := Grid.Text[Node, i]; // Remove 0x. if GridData.Columns[i].DatatypeCat = dtcBinary then Delete(Data, 1, 2); - // Unformat float values - if GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal] then Data := UnformatNumber(Data); + // Unformat numeric values + if (GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal]) and (not Mainform.prefExportLocaleNumbers) then + Data := UnformatNumber(Data); // Escape XML control characters in data. Data := htmlentities(Data); // Add data and cell end tag. @@ -1153,7 +1158,7 @@ begin Data := Grid.Text[Node, i]; // Remove 0x. if GridData.Columns[i].DatatypeCat = dtcBinary then Delete(Data, 1, 2); - // Unformat float values + // Unformat numeric values if GridData.Columns[i].DatatypeCat in [dtcInteger, dtcReal] then Data := UnformatNumber(Data); // Add data and cell end tag. tmp := tmp + esc(Data); diff --git a/source/main.pas b/source/main.pas index 55f33ea0..7ed3e41d 100644 --- a/source/main.pas +++ b/source/main.pas @@ -778,7 +778,8 @@ type prefEnableDatetimeEditor, prefEnableEnumEditor, prefEnableSetEditor, - prefEnableNullBG : Boolean; + prefEnableNullBG, + prefExportLocaleNumbers : Boolean; prefNullColorDefault, prefNullBG : TColor; CreateDatabaseForm : TCreateDatabaseForm; @@ -1225,6 +1226,7 @@ begin prefCSVSeparator := GetRegValue(REGNAME_CSV_SEPARATOR, DEFAULT_CSV_SEPARATOR); prefCSVEncloser := GetRegValue(REGNAME_CSV_ENCLOSER, DEFAULT_CSV_ENCLOSER); prefCSVTerminator := GetRegValue(REGNAME_CSV_TERMINATOR, DEFAULT_CSV_TERMINATOR); + prefExportLocaleNumbers := GetRegValue(REGNAME_EXPORT_LOCALENUMBERS, DEFAULT_EXPORT_LOCALENUMBERS); prefRememberFilters := GetRegValue(REGNAME_REMEMBERFILTERS, DEFAULT_REMEMBERFILTERS); // Data-Font: diff --git a/source/options.dfm b/source/options.dfm index 728aa190..f698a8d9 100644 --- a/source/options.dfm +++ b/source/options.dfm @@ -785,6 +785,17 @@ object optionsform: Toptionsform Wrap = True OnChanging = anyUpDownLimitChanging end + object chkExportLocaleNumbers: TCheckBox + Left = 8 + Top = 232 + Width = 385 + Height = 17 + Anchors = [akLeft, akTop, akRight] + Caption = + 'Use locale number format in grid exports (MS Excel paste compati' + + 'bility)' + TabOrder = 3 + end end object tabShortcuts: TTabSheet Caption = 'Shortcuts' diff --git a/source/options.pas b/source/options.pas index 4564edd2..a6b57212 100644 --- a/source/options.pas +++ b/source/options.pas @@ -118,6 +118,7 @@ type grpSQLTabWidth: TGroupBox; editSQLTabWidth: TEdit; updownSQLTabWidth: TUpDown; + chkExportLocaleNumbers: TCheckBox; procedure FormShow(Sender: TObject); procedure Modified(Sender: TObject); procedure Apply(Sender: TObject); @@ -222,6 +223,7 @@ begin MainReg.WriteString(REGNAME_CSV_ENCLOSER, editCSVEncloser.Text); MainReg.WriteString(REGNAME_CSV_TERMINATOR, editCSVTerminator.Text); MainReg.WriteInteger(REGNAME_COPYMAXSIZE, updownCopyDataMaxSize.Position); + MainReg.WriteBool(REGNAME_EXPORT_LOCALENUMBERS, chkExportLocaleNumbers.Checked); MainReg.WriteInteger(REGNAME_MAXCOLWIDTH, updownMaxColWidth.Position); maxrows := StrToIntDef(editMaxTotalRows.Text, DEFAULT_MAXTOTALROWS); @@ -297,6 +299,7 @@ begin Mainform.prefCSVSeparator := editCSVSeparator.Text; Mainform.prefCSVEncloser := editCSVEncloser.Text; Mainform.prefCSVTerminator := editCSVTerminator.Text; + Mainform.prefExportLocaleNumbers := chkExportLocaleNumbers.Checked; DatatypeCategories[Integer(dtcInteger)].Color := cboxNumeric.Selected; DatatypeCategories[Integer(dtcReal)].Color := cboxNumeric.Selected; DatatypeCategories[Integer(dtcText)].Color := cboxText.Selected; @@ -385,6 +388,7 @@ begin editCSVEncloser.Text := GetRegValue(REGNAME_CSV_ENCLOSER, DEFAULT_CSV_ENCLOSER); editCSVTerminator.Text := GetRegValue(REGNAME_CSV_TERMINATOR, DEFAULT_CSV_TERMINATOR); updownCopyDataMaxSize.Position := GetRegValue(REGNAME_COPYMAXSIZE, DEFAULT_COPYMAXSIZE); + chkExportLocaleNumbers.Checked := GetRegValue(REGNAME_EXPORT_LOCALENUMBERS, DEFAULT_EXPORT_LOCALENUMBERS); // Log to file chkLogToFile.Checked := GetRegValue(REGNAME_LOGTOFILE, DEFAULT_LOGTOFILE);