diff --git a/components/fpspreadsheet/examples/spready/spready.lpi b/components/fpspreadsheet/examples/spready/spready.lpi index dbb3b2a44..e16146a05 100644 --- a/components/fpspreadsheet/examples/spready/spready.lpi +++ b/components/fpspreadsheet/examples/spready/spready.lpi @@ -35,9 +35,6 @@ - - - @@ -73,9 +70,6 @@ - - - @@ -152,9 +146,6 @@ - - - diff --git a/components/fpspreadsheet/fpscsv.pas b/components/fpspreadsheet/fpscsv.pas index 2ff01c728..88225cd5d 100644 --- a/components/fpspreadsheet/fpscsv.pas +++ b/components/fpspreadsheet/fpscsv.pas @@ -267,6 +267,7 @@ var boolValue: Boolean; currSym: string; warning: String; + nf: TsNumberFormat; begin // Empty strings are blank cells -- nothing to do if AText = '' then @@ -305,9 +306,17 @@ begin end; // Check for a DATE/TIME cell + // No idea how to apply the date/time formatsettings here... if IsDateTime(AText, dtValue) then begin - FWorksheet.WriteDateTime(ARow, ACol, dtValue); + if dtValue < 1.0 then // this is a time alone + nf := nfLongTime + else + if frac(dtValue) = 0.0 then // this is a date alone + nf := nfShortDate + else // this is date + time + nf := nfShortDateTime; + FWorksheet.WriteDateTime(ARow, ACol, dtValue, nf); exit; end; diff --git a/components/fpspreadsheet/fpsutils.pas b/components/fpspreadsheet/fpsutils.pas index daed6f791..9daf791a1 100644 --- a/components/fpspreadsheet/fpsutils.pas +++ b/components/fpspreadsheet/fpsutils.pas @@ -1506,9 +1506,9 @@ begin // but no decimal separator misinterprets the thousand separator as a // decimal separator. - done := false; // Indicates that both decimal and thousand separators are found - testSep := #0; // Separator candidate to be tested - testSepPos := 0; // Position of this separator chandidate in the string + done := false; // Indicates that both decimal and thousand separators are found + testSep := #0; // Separator candidate to be tested + testSepPos := 0; // Position of this separator chandidate in the string i := Length(AText); // Start at end... while i >= 1 do // ...and search towards start begin @@ -1523,17 +1523,29 @@ begin dec(i); while i >= 1 do begin + if not (AText[i] in ['0'..'9']) then begin + Result := false; + exit; + end; // If we find the testSep character again it must be a thousand separator. - if AText[i] = testSep then + if (AText[i] = testSep) then begin - fs.ThousandSeparator := testSep; - // The decimal separator is the "other" character. - if testSep = '.' then - fs.DecimalSeparator := ',' - else - fs.DecimalSeparator := '.'; - done := true; - i := 0; + // ... but only if there are 3 numerical digits in between + if (testSepPos - i = 4) then + begin + fs.ThousandSeparator := testSep; + // The decimal separator is the "other" character. + if testSep = '.' then + fs.DecimalSeparator := ',' + else + fs.DecimalSeparator := '.'; + done := true; + i := 0; + end else + begin + Result := false; + exit; + end; end else // If we find the "other" separator character, then testSep was a @@ -1547,6 +1559,12 @@ begin end; dec(i); end; + end else + if not (AText[i] in ['0'..'9', '+', '-', 'e', 'E', '%']) then + begin + Result := false; + AWarning := ''; + exit; end; dec(i); end;