You've already forked lazarus-ccr
fpspreadsheet: Improved conversion of numbers to formatted strings, handles more special cases (e.g. integer-only fractions, optional digits, optional space digits).
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4094 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -1031,6 +1031,7 @@ begin
|
||||
decs := Worksheet.GetDisplayedDecimals(ACell)
|
||||
else
|
||||
decs := FDecimals;
|
||||
|
||||
inc(decs, FDelta);
|
||||
if decs < 0 then decs := 0;
|
||||
Worksheet.WriteDecimals(ACell, decs);
|
||||
|
@ -135,6 +135,7 @@ begin
|
||||
FWorkbook := AWorkbook;
|
||||
Parse(AFormatString);
|
||||
CheckSections;
|
||||
if AFormatString = '' then FSections[0].NumFormat := nfGeneral;
|
||||
end;
|
||||
|
||||
destructor TsNumFormatParser.Destroy;
|
||||
@ -1358,12 +1359,19 @@ end;
|
||||
procedure TsNumFormatParser.SetDecimals(AValue: Byte);
|
||||
var
|
||||
i, j, n: Integer;
|
||||
foundDecs: Boolean;
|
||||
begin
|
||||
foundDecs := false;
|
||||
for j := 0 to High(FSections) do begin
|
||||
n := Length(FSections[j].Elements);
|
||||
i := n-1;
|
||||
while (i > -1) do begin
|
||||
case FSections[j].Elements[i].Token of
|
||||
nftDecSep: // this happens, e.g., for "0.E+00"
|
||||
if (AValue > 0) and not foundDecs then begin
|
||||
InsertElement(j, i, nftZeroDecs, AValue);
|
||||
break;
|
||||
end;
|
||||
nftIntOptDigit, nftIntZeroDigit, nftIntSpaceDigit, nftIntTh:
|
||||
// no decimals so far --> add decimal separator and decimals element
|
||||
if (AValue > 0) then begin
|
||||
@ -1373,16 +1381,19 @@ begin
|
||||
break;
|
||||
end;
|
||||
nftZeroDecs, nftOptDecs, nftSpaceDecs:
|
||||
if AValue > 0 then begin
|
||||
// decimals are already used, just replace value of decimal places
|
||||
FSections[j].Elements[i].IntValue := AValue;
|
||||
FSections[j].Elements[i].Token := nftZeroDecs;
|
||||
break;
|
||||
end else begin
|
||||
// No decimals any more: delete decs and decsep elements
|
||||
DeleteElement(j, i);
|
||||
DeleteElement(j, i-1);
|
||||
break;
|
||||
begin
|
||||
foundDecs := true;
|
||||
if AValue > 0 then begin
|
||||
// decimals are already used, just replace value of decimal places
|
||||
FSections[j].Elements[i].IntValue := AValue;
|
||||
FSections[j].Elements[i].Token := nftZeroDecs;
|
||||
break;
|
||||
end else begin
|
||||
// No decimals any more: delete decs and decsep elements
|
||||
DeleteElement(j, i);
|
||||
DeleteElement(j, i-1);
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
dec(i);
|
||||
|
@ -4424,12 +4424,15 @@ var
|
||||
numFmt: TsNumFormatParams;
|
||||
numFmtStr: String;
|
||||
begin
|
||||
if (ACell = nil) then
|
||||
if (ACell = nil) or (ACell^.ContentType <> cctNumber) then
|
||||
exit;
|
||||
|
||||
fmt := FWorkbook.GetCellFormat(ACell^.FormatIndex);
|
||||
numFmt := FWorkbook.GetNumberFormat(fmt.NumberFormatIndex);
|
||||
numFmtStr := numFmt.NumFormatStr;
|
||||
if numFmt <> nil then
|
||||
numFmtStr := numFmt.NumFormatStr
|
||||
else
|
||||
numFmtStr := '0.00';
|
||||
parser := TsNumFormatParser.Create(Workbook, numFmtStr);
|
||||
try
|
||||
parser.Decimals := ADecimals;
|
||||
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user