diff --git a/components/fpspreadsheet/fpspreadsheet.pas b/components/fpspreadsheet/fpspreadsheet.pas
index fdc6f0168..8ddf41101 100755
--- a/components/fpspreadsheet/fpspreadsheet.pas
+++ b/components/fpspreadsheet/fpspreadsheet.pas
@@ -2489,6 +2489,9 @@ function TsWorksheet.ReadAsUTF8Text(ACell: PCell;
else
if (ANumberFormat = nfPercentage) then
Result := FormatFloat(ANumberFormatStr, AValue*100, AFormatSettings)
+ else
+ if IsCurrencyFormat(ANumberFormat) then
+ Result := FormatCurr(ANumberFormatStr, AValue, AFormatSettings)
else
Result := FormatFloat(ANumberFormatStr, AValue, AFormatSettings)
end;
@@ -3933,7 +3936,7 @@ begin
if ANegCurrFormat = -1 then
ANegCurrFormat := Workbook.FormatSettings.NegCurrFormat;
if ACurrencySymbol = '?' then
- ACurrencySymbol := AnsiToUTF8(Workbook.FormatSettings.CurrencyString);
+ ACurrencySymbol := Workbook.FormatSettings.CurrencyString;
fmt := BuildCurrencyFormatString(
nfdDefault,
diff --git a/components/fpspreadsheet/tests/formattests.pas b/components/fpspreadsheet/tests/formattests.pas
index 8e9df87cf..ad4256607 100644
--- a/components/fpspreadsheet/tests/formattests.pas
+++ b/components/fpspreadsheet/tests/formattests.pas
@@ -22,10 +22,10 @@ uses
var
// Norm to test against - list of strings that should occur in spreadsheet
- SollNumberStrings: array[0..6, 0..7] of string;
+ SollNumberStrings: array[0..6, 0..9] of string;
SollNumbers: array[0..6] of Double;
- SollNumberFormats: array[0..7] of TsNumberFormat;
- SollNumberDecimals: array[0..7] of word;
+ SollNumberFormats: array[0..9] of TsNumberFormat;
+ SollNumberDecimals: array[0..9] of word;
SollDateTimeStrings: array[0..4, 0..9] of string;
SollDateTimes: array[0..4] of TDateTime;
@@ -197,6 +197,10 @@ begin
SollNumberFormats[5] := nfExp; SollNumberDecimals[5] := 2;
SollNumberFormats[6] := nfPercentage; SollNumberDecimals[6] := 0;
SollNumberFormats[7] := nfPercentage; SollNumberDecimals[7] := 2;
+ SollNumberFormats[8] := nfCurrency; SollNumberDecimals[8] := 1; // This should be 0, but there is a bug in fpc, issue #0026944)
+ SollNumberFormats[9] := nfCurrency; SollNumberDecimals[9] := 2;
+
+ SollNumberstrings[0, 0] := CurrToStrF(-1000.1, ffCurrency, 0, fs);
for i:=Low(SollNumbers) to High(SollNumbers) do
begin
@@ -208,6 +212,8 @@ begin
SollNumberStrings[i, 5] := FormatFloat('0.00E+00', SollNumbers[i], fs);
SollNumberStrings[i, 6] := FormatFloat('0', SollNumbers[i]*100, fs) + '%';
SollNumberStrings[i, 7] := FormatFloat('0.00', SollNumbers[i]*100, fs) + '%';
+ SollNumberStrings[i, 8] := CurrToStrF(SollNumbers[i], ffCurrency, SollNumberDecimals[8], fs);
+ SollNumberStrings[i, 9] := CurrToStrF(SollNumbers[i], ffCurrency, SollNumberDecimals[9], fs);
end;
// Date/time values
@@ -336,7 +342,10 @@ begin
for Row := Low(SollNumbers) to High(SollNumbers) do
for Col := ord(Low(SollNumberFormats)) to ord(High(SollNumberFormats)) do
begin
- MyWorksheet.WriteNumber(Row, Col, SollNumbers[Row], SollNumberFormats[Col], SollNumberDecimals[Col]);
+ if IsCurrencyFormat(SollNumberFormats[Col]) then
+ MyWorksheet.WriteCurrency(Row, Col, SollNumbers[Row], SollNumberFormats[Col], SollNumberDecimals[Col])
+ else
+ MyWorksheet.WriteNumber(Row, Col, SollNumbers[Row], SollNumberFormats[Col], SollNumberDecimals[Col]);
ActualString := MyWorksheet.ReadAsUTF8Text(Row, Col);
CheckEquals(SollNumberStrings[Row, Col], ActualString,
'Test unsaved string mismatch, cell ' + CellNotation(MyWorksheet,Row,Col));
diff --git a/components/fpspreadsheet/tests/spreadtestgui.lpi b/components/fpspreadsheet/tests/spreadtestgui.lpi
index fc62e2c66..a84f32567 100644
--- a/components/fpspreadsheet/tests/spreadtestgui.lpi
+++ b/components/fpspreadsheet/tests/spreadtestgui.lpi
@@ -48,7 +48,6 @@
-
@@ -61,21 +60,19 @@
-
-
-
+
@@ -100,7 +97,6 @@
-
@@ -109,7 +105,6 @@
-
@@ -118,7 +113,6 @@
-
@@ -127,7 +121,6 @@
-
diff --git a/components/fpspreadsheet/xlsbiff5.pas b/components/fpspreadsheet/xlsbiff5.pas
index f44cb8278..7d967b889 100755
--- a/components/fpspreadsheet/xlsbiff5.pas
+++ b/components/fpspreadsheet/xlsbiff5.pas
@@ -405,7 +405,6 @@ begin
len := Length(Boundsheets);
SetLength(Boundsheets, len + 1);
Boundsheets[len] := WriteBoundsheet(AStream, Workbook.GetWorksheetByIndex(i).Name);
- // BIFF8 does not support unicode --> Need UTF8ToAnsi !
end;
WriteEOF(AStream);
@@ -677,7 +676,7 @@ begin
if (AFormatData = nil) or (AFormatData.FormatString = '') then
exit;
- s := NumFormatList.FormatStringForWriting(AListIndex);
+ s := UTF8ToAnsi(NumFormatList.FormatStringForWriting(AListIndex));
len := Length(s);
{ BIFF record header }
@@ -1215,7 +1214,8 @@ end;
procedure TsSpreadBIFF5Reader.ReadBoundsheet(AStream: TStream);
var
Len: Byte;
- Str: array[0..255] of Char;
+ s: AnsiString;
+ sheetName: String;
begin
{ Absolute stream position of the BOF record of the sheet represented
by this record }
@@ -1230,11 +1230,11 @@ begin
{ Sheet name: Byte string, 8-bit length }
Len := AStream.ReadByte();
- Str[0] := #0; // to silence the compiler...
- AStream.ReadBuffer(Str, Len);
- Str[Len] := #0;
- FWorksheetNames.Add(Str);
+ SetLength(s, Len);
+ AStream.ReadBuffer(s[1], Len*SizeOf(AnsiChar));
+ sheetName := AnsiToUTF8(s);
+ FWorksheetNames.Add(sheetName);
end;
procedure TsSpreadBIFF5Reader.ReadRichString(AStream: TStream);
@@ -1565,7 +1565,7 @@ begin
AStream.ReadBuffer(fmtString[1], len);
// Add to the list
- NumFormatList.AnalyzeAndAdd(fmtIndex, fmtString);
+ NumFormatList.AnalyzeAndAdd(fmtIndex, AnsiToUTF8(fmtString));
end;
procedure TsSpreadBIFF5Reader.ReadLabel(AStream: TStream);
diff --git a/components/fpspreadsheet/xlsbiff8.pas b/components/fpspreadsheet/xlsbiff8.pas
index beef9ab7a..8412bd4bb 100755
--- a/components/fpspreadsheet/xlsbiff8.pas
+++ b/components/fpspreadsheet/xlsbiff8.pas
@@ -736,7 +736,8 @@ type
end;
var
len: Integer;
- s: widestring;
+ s: String;
+ ws: widestring;
rec: TNumFormatRecord;
buf: array of byte;
begin
@@ -744,7 +745,8 @@ begin
exit;
s := NumFormatList.FormatStringForWriting(AListIndex);
- len := Length(s);
+ ws := UTF8Decode(s);
+ len := Length(ws);
{ BIFF record header }
rec.RecordID := WordToLE(INT_EXCEL_ID_FORMAT);
@@ -761,7 +763,7 @@ begin
{ - Copy the text characters into a buffer immediately after rec }
SetLength(buf, SizeOf(rec) + SizeOf(WideChar)*len);
Move(rec, buf[0], SizeOf(rec));
- Move(s[1], buf[SizeOf(rec)], len*SizeOf(WideChar));
+ Move(ws[1], buf[SizeOf(rec)], len*SizeOf(WideChar));
{ Write out }
AStream.WriteBuffer(buf[0], SizeOf(rec) + SizeOf(WideChar)*len);
diff --git a/components/fpspreadsheet/xlscommon.pas b/components/fpspreadsheet/xlscommon.pas
index 6b531902b..11df6478e 100644
--- a/components/fpspreadsheet/xlscommon.pas
+++ b/components/fpspreadsheet/xlscommon.pas
@@ -561,7 +561,7 @@ var
cs: String;
begin
fs := Workbook.FormatSettings;
- cs := AnsiToUTF8(Workbook.FormatSettings.CurrencyString);
+ cs := Workbook.FormatSettings.CurrencyString;
AddFormat( 0, '', nfGeneral);
AddFormat( 1, '0', nfFixed);