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;