lazarus-ccr/components/fpspreadsheet/tests/rpnformulaunit.pas

2020 lines
60 KiB
ObjectPascal

unit rpnFormulaUnit;
interface
uses
{$IFDEF Unix}
clocale, //required for formatsettings
{$ENDIF}
SysUtils, fpstypes, fpspreadsheet,fpsutils;
procedure WriteRPNFormulaSamples(Worksheet: TsWorksheet;
AFormat: TsSpreadsheetFormat; IncludeErrors: Boolean);
implementation
uses
Math, StrUtils, fpsRPN;
const
FALSE_TRUE: array[Boolean] of String = ('FALSE', 'TRUE');
procedure WriteRPNFormulaSamples(Worksheet: TsWorksheet;
AFormat: TsSpreadSheetFormat; IncludeErrors: Boolean);
const
cellB1 = 1.0;
cellC1 = 2.0;
cellD1 = 3.0;
cellE1 = -1.0;
cellF1 = 1.4567;
cellG1 = -1.4567;
SBaseCells = 'Data cells:';
SHelloWorld = 'Hello world!';
var
Row: Integer;
value: Double;
r,c: Cardinal;
celladdr: String;
fs: TFormatSettings;
ls: char;
begin
if Worksheet = nil then
exit;
fs := Worksheet.Workbook.FormatSettings;
ls := fs.ListSeparator;
{ When fpspreadsheet creates a formula string it uses the list separator of
the formatting to separate arguments. Therefore, we insert the list separator
in the expected formula strings as well. Unfortunately, these strings look
a bit inconvenient here:
'=SUM(A1, B1)' becomes Format('=SUM(A1%s B1)', [ls]) }
Worksheet.WriteUTF8Text(0, 0, SBaseCells);
Worksheet.WriteFont(0, 0, BOLD_FONTINDEX);
Worksheet.WriteNumber(0,1, cellB1);
Worksheet.WriteNumber(0,2, cellC1);
Worksheet.WriteNumber(0,3, cellD1);
Worksheet.WriteNumber(0,4, cellE1);
Worksheet.WriteNumber(0,5, cellF1);
Worksheet.WriteNumber(0,6, cellG1);
Row := 2;
Worksheet.WriteUTF8Text(Row, 1, 'read value');
Worksheet.WriteFont(Row, 1, BOLD_FONTINDEX);
Worksheet.WriteUTF8Text(Row, 2, 'expected value');
Worksheet.WriteFont(Row, 2, BOLD_FONTINDEX);
{ ---------- }
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'Constants');
Worksheet.WriteFont(Row, 0, BOLD_FONTINDEX);
// Numbers
inc(Row);
value := 1.2;
Worksheet.WriteUTF8Text(Row, 0, '='+Format('%.1f', [value], fs));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
nil))
);
Worksheet.WriteNumber(Row, 2, value);
// Strings
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('="%s"', [SHelloWorld]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld,
nil)));
Worksheet.WriteUTF8Text(Row, 2, SHelloWorld);
// Boolean
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=TRUE');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNBool(true,
nil)));
Worksheet.WriteUTF8Text(Row, 2, 'TRUE');
{ ---------- }
inc(Row);
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'Cell references - please check formula in editing line');
Worksheet.WriteFont(Row, 0, BOLD_FONTINDEX);
// Absolute col and row references
inc(Row);
cellAddr := '$B$1';
Worksheet.WriteUTF8Text(Row, 0, '='+cellAddr);
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue(cellAddr,
nil
)));
Worksheet.WriteNumber(Row, 2, cellB1);
// Relative col and row references
inc(Row);
cellAddr := 'B1';
Worksheet.WriteUTF8Text(Row, 0, '='+cellAddr);
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue(cellAddr,
nil
)));
Worksheet.WriteNumber(Row, 2, cellB1);
// Relative row reference
inc(Row);
cellAddr := '$B1';
Worksheet.WriteUTF8Text(Row, 0, '='+cellAddr);
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B1',
nil
)));
Worksheet.WriteNumber(Row, 2, cellB1);
// Relative col reference
inc(Row);
cellAddr := 'B$1';
Worksheet.WriteUTF8Text(Row, 0, '='+cellAddr);
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B$1',
nil
)));
Worksheet.WriteNumber(Row, 2, cellB1);
// Relative block reference
inc(Row);
cellAddr := 'A1:G2';
Worksheet.WriteUTF8Text(Row, 0, Format('=COUNT(%s)', [cellAddr]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRange(cellAddr,
RPNFunc('COUNT', 1, // 1 parameter used in COUNT
nil
))));
Worksheet.WriteNumber(Row, 2, 6); // 7 cells, but 1 is alpha-numerical!
// Relative block cols reference
inc(Row);
cellAddr := 'A$1:G$2';
Worksheet.WriteUTF8Text(Row, 0, Format('=COUNT(%s)', [cellAddr]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRange(cellAddr,
RPNFunc('COUNT', 1,
nil
))));
Worksheet.WriteNumber(Row, 2, 6); // 7 cells, but 1 is alph-numerical!
// Relative block rows reference
inc(Row);
cellAddr := '$A1:$G2';
Worksheet.WriteUTF8Text(Row, 0, Format('=COUNT(%s)', [cellAddr]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRange(cellAddr,
RPNFunc('COUNT', 1,
nil
))));
Worksheet.WriteNumber(Row, 2, 6); // 7 cells, but 1 is alpha-numerical!
{ ---------- }
inc(Row);
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'Basic operations');
Worksheet.WriteFont(Row, 0, BOLD_FONTINDEX);
// Add two cells
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=B1+C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1',
RPNCellValue('C1',
RPNFunc(fekAdd,
nil
)))));
Worksheet.WriteNumber(Row, 2, cellB1 + cellC1);
// Add three cells
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=B1+C1+$D$1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1',
RPNCellValue('C1',
RPNCellvalue('$D$1',
RPNFunc(fekAdd,
RPNFunc(fekAdd,
nil
)))))));
Worksheet.WriteNumber(Row, 2, cellB1 + cellC1 + cellD1);
// Subtract two cells
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=B1-C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1',
RPNCellValue('C1',
RPNFunc(fekSub,
nil
)))));
Worksheet.WriteNumber(Row, 2, cellB1 - cellC1);
// Multiply two (absolute) cells = $C$1*$D$1
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=$C$1*$D$1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$C$1',
RPNCellValue('$D$1',
RPNFunc(fekMul,
nil
)))));
Worksheet.WriteNumber(Row, 2, cellC1 * cellD1);
// Divide two (relative) cells = C1/D1
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1/D1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('D1',
RPNFunc(fekDiv,
nil
)))));
Worksheet.WriteNumber(Row, 2, cellC1 / cellD1);
// Power of two cells = C1^D1
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1^D1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('D1',
RPNFunc(fekPower,
nil
)))));
Worksheet.WriteNumber(Row, 2, Power(cellC1, cellD1));
// Unary plus =+C1
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=+C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNFunc(fekUPlus,
nil
))));
Worksheet.WriteNumber(Row, 2, +cellC1);
// Unary minus =-$C$1
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=-$C$1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$C$1',
RPNFunc(fekUMinus,
nil
))));
Worksheet.WriteNumber(Row, 2, -cellC1);
// Percent
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=B1*$C$1%');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1',
RPNCellValue('$C$1',
RPNFunc(fekPercent,
RPNFunc(fekMul,
nil
))))));
Worksheet.WriteUTF8Text(Row, 2, FloatToStr(cellB1*cellC1/100));
// String concatenation
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '="Hello "&"world"');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('Hello ',
RPNString('world',
RPNFunc(fekConcat,
nil
)))));
Worksheet.WriteUTF8Text(Row, 2, 'Hello ' + 'world');
// Less Than - case a
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1<D1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('D1',
RPNFunc(fekLess,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1<cellD1]);
// Less Than - case b
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=D1<C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('D1',
RPNCellValue('C1',
RPNFunc(fekLess,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellD1<cellC1]);
// Less Than - case c (equal)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1<C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('C1',
RPNFunc(fekLess,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1<cellC1]);
// Less Than or Equal - case a
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1<=D1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('D1',
RPNFunc(fekLessEqual,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1<=cellD1]);
// LessThan or Equal - case b
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=D1<=C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('D1',
RPNCellValue('C1',
RPNFunc(fekLessEqual,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellD1<=cellC1]);
// LessThan or Equal - case c
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1<=C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('C1',
RPNFunc(fekLessEqual,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1<=cellC1]);
// Greater Than - case a
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1>D1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('D1',
RPNFunc(fekGreater,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1>cellD1]);
// Greater Than - case b
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=D1>C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('D1',
RPNCellValue('C1',
RPNFunc(fekGreater,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellD1>cellC1]);
// Greater Than - case c
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1>C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('C1',
RPNFunc(fekGreater,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1>cellC1]);
// Greater Than or Equal - case a
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1>=D1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('D1',
RPNFunc(fekGreaterEqual,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1>=cellD1]);
// Greater Than or Equal - case b
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=D1>=C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('D1',
RPNCellValue('C1',
RPNFunc(fekGreaterEqual,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellD1>=cellC1]);
// Greater Than or Equal - case c
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1>=C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('C1',
RPNFunc(fekGreaterEqual,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1>=cellC1]);
// Equal - case a
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1=D1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('D1',
RPNFunc(fekEqual,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1=cellD1]);
// Equal - case b
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=D1=C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('D1',
RPNCellValue('C1',
RPNFunc(fekEQUAL,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellD1=cellC1]);
// Equal - case c
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1=C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('C1',
RPNFunc(fekEQUAL,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1=cellC1]);
// Not equal - case a
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1<>D1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('D1',
RPNFunc(fekNotEQUAL,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1<>cellD1]);
// Not equal - case b
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=D1<>C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('D1',
RPNCellValue('C1',
RPNFunc(fekNotEQUAL,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellD1<>cellC1]);
// Not equal - case c
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=C1<>C1');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('C1',
RPNFunc(fekNotEQUAL,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[cellC1<>cellC1]);
{ ---------- }
inc(Row);
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'Logical functions');
Worksheet.WriteFont(Row, 0, BOLD_FONTINDEX);
// TRUE()
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=TRUE()');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNFunc('TRUE',
nil)));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[true]);
// FALSE()
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=FALSE()');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNFunc('FALSE',
nil)));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[false]);
// Logical NOT
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=NOT(C1=C1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('C1',
RPNCellValue('C1',
RPNFunc(fekEqual,
RPNFunc('NOT',
nil))))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[not (cellC1=cellC1)]);
// Logical AND - case false/false =AND(1=0, 1=2)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=AND(1=0%s 1=2)',[ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1,
RPNNumber(0,
RPNFunc(fekEQUAL,
RPNNumber(1,
RPNNumber(2,
RPNFunc(fekEQUAL,
RPNFunc('AND', 2,
nil)))))))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[(1=0) and (1=2)]);
// Logical AND - case false/true =AND(1=0, 2=2)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=AND(1=0%s 2=2)', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1,
RPNNumber(0,
RPNFunc(fekEQUAL,
RPNNumber(2,
RPNNumber(2,
RPNFunc(fekEQUAL,
RPNFunc('AND', 2,
nil)))))))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[(1=0) and (2=2)]);
// Logical AND - case true/true =AND(1=1, 2=2)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=AND(1=1%s 2=2)', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1,
RPNNumber(1,
RPNFunc(fekEQUAL,
RPNNumber(2,
RPNNumber(2,
RPNFunc(fekEQUAL,
RPNFunc('AND', 2,
nil)))))))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[(1=1) and (2=2)]);
// Logical OR - case false/false =OR(1=0, 1=2)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=OR(1=0%s 1=2)',[ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1,
RPNNumber(0,
RPNFunc(fekEQUAL,
RPNNumber(1,
RPNNumber(2,
RPNFunc(fekEQUAL,
RPNFunc('OR', 2,
nil)))))))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[(1=0) or (1=2)]);
// Logical OR - case false/true =OR(1=0, 2=2)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=OR(1=0%s 2=2)', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1,
RPNNumber(0,
RPNFunc(fekEQUAL,
RPNNumber(2,
RPNNumber(2,
RPNFunc(fekEQUAL,
RPNFunc('OR', 2,
nil)))))))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[(1=0) or (2=2)]);
// Logical OR - case true/true =OR(1=1, 2=2)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=OR(1=1%s 2=2)', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1,
RPNNumber(1,
RPNFunc(fekEQUAL,
RPNNumber(2,
RPNNumber(2,
RPNFunc(fekEQUAL,
RPNFunc('OR', 2,
nil)))))))));
Worksheet.WriteUTF8Text(Row, 2, FALSE_TRUE[(1=1) or (2=2)]);
// IF - case true =IF(B1=1, "correct", "wrong")
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=IF(B1=1%s "correct"%s "wrong")', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1',
RPNNumber(1,
RPNFunc(fekEQUAL,
RPNString('correct',
RPNString('wrong',
RPNFunc('IF', 3,
nil))))))));
Worksheet.WriteUTF8Text(Row, 2, IfThen(cellB1=1.0, 'correct', 'wrong'));
// IF - case false =IF(B1<>1, "correct", "wrong")
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=IF(B1<>1%s "correct"%s "wrong")', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1',
RPNNumber(1,
RPNFunc(fekNotEQUAL,
RPNString('correct',
RPNString('wrong',
RPNFunc('IF', 3,
nil))))))));
Worksheet.WriteUTF8Text(Row, 2, IfThen(cellB1<>1.0, 'correct', 'wrong'));
// IF - case true (2 params) =IF(B1=1, "correct")
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=IF(B1=1%s "correct")', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1',
RPNNumber(1,
RPNFunc(fekEQUAL,
RPNString('correct',
RPNFunc('IF', 2,
nil)))))));
Worksheet.WriteUTF8Text(Row, 2, IfThen(cellB1=1.0, 'correct', 'FALSE'));
// IF - case false (2 params) =IF(B1<>1, "correct")
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=IF(B1<>1%s "correct")', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1',
RPNNumber(1,
RPNFunc(fekNotEQUAL,
RPNString('correct',
RPNFunc('IF', 2,
nil)))))));
Worksheet.WriteUTF8Text(Row, 2, IfThen(cellB1<>1.0, 'correct', 'FALSE'));
{ ---------- }
inc(Row);
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'Math functions');
Worksheet.WriteFont(Row, 0, BOLD_FONTINDEX);
// absolute of positive number
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ABS($B1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B1',
RPNFunc('ABS',
nil))));
Worksheet.WriteNumber(Row, 2, abs(cellB1));
// absolute of negative number
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ABS(E$1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('E$1',
RPNFunc('ABS',
nil))));
Worksheet.WriteNumber(Row, 2, abs(cellE1));
// sign of positive number
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=SIGN(F1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('F1',
RPNFunc('SIGN',
nil))));
Worksheet.WriteNumber(Row, 2, sign(cellF1));
// sign of zero
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=SIGN(0)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0,
RPNFunc('SIGN',
nil))));
Worksheet.WriteNumber(Row, 2, sign(0));
// sign of negative number
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=SIGN(G1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1',
RPNFunc('SIGN',
nil))));
Worksheet.WriteNumber(Row, 2, sign(cellG1));
// Random number
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=RAND()');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNFunc('RAND',
nil)));
Worksheet.WriteUTF8Text(Row, 2, '(random number - cannot compare)');
// pi
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=PI()');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNFunc('PI',
nil)));
Worksheet.WriteNumber(Row, 2, pi);
if AFormat <> sfExcel2 then begin
// Degrees
inc(Row);
value := pi/2;
Worksheet.WriteUTF8Text(Row, 0, '=DEGREES(PI()/2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNFunc('PI',
RPNNumber(2,
RPNFunc(fekDIV,
RPNFunc('DEGREES',
nil))))));
Worksheet.WriteNumber(Row, 2, value/pi*180);
// Radians
inc(Row);
value := 90;
Worksheet.WriteUTF8Text(Row, 0, '=RADIANS(90)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('RADIANS',
nil))));
Worksheet.WriteNumber(Row, 2, value/180*pi);
end;
// sin(pi/2)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=SIN(PI()/2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNFunc('PI',
RPNNumber(2,
RPNFunc(fekDIV,
RPNFunc('SIN',
nil))))));
Worksheet.WriteNumber(Row, 2, sin(pi/2));
// arcsin(0.5) =ASIN(0.5)
inc(Row);
value := 0.5;
Worksheet.WriteUTF8Text(Row, 0, Format('=ASIN(%.1f)', [value], fs));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('ASIN',
nil))));
Worksheet.WriteNumber(Row, 2, arcsin(value));
// cos(pi)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=COS(PI())');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNFunc('PI',
RPNFunc('COS',
nil))));
Worksheet.WriteNumber(Row, 2, cos(pi));
// arccos(0.5) =ACOS(0.5)
inc(Row);
value := 0.5;
Worksheet.WriteUTF8Text(Row, 0, Format('=ACOS(%.1f)', [value], fs));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('ACOS',
nil))));
Worksheet.WriteNumber(Row, 2, arccos(value));
// tan(pi/4)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=TAN(PI()/4)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNFunc('PI',
RPNNumber(4,
RPNFunc(fekDiv,
RPNFunc('TAN',
nil))))));
Worksheet.WriteNumber(Row, 2, tan(pi/4));
// arctan(1)
inc(Row);
value := 1.0;
Worksheet.WriteUTF8Text(Row, 0, '=ATAN(1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('ATAN',
nil))));
Worksheet.WriteNumber(Row, 2, arctan(1.0));
if AFormat <> sfExcel2 then begin
// Next functions are not available in BIFF2
// sinh
inc(Row);
value := 3;
Worksheet.WriteUTF8Text(Row, 0, '=SINH(3)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('SINH',
nil))));
Worksheet.WriteNumber(Row, 2, sinh(value));
// arcsinh =ASIN(0.5)
inc(Row);
value := 0.5;
Worksheet.WriteUTF8Text(Row, 0, Format('=ASINH(%.1f)', [value], fs));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('ASINH',
nil))));
Worksheet.WriteNumber(Row, 2, arcsinh(value));
// cosh
inc(Row);
value := 3;
Worksheet.WriteUTF8Text(Row, 0, '=COSH(3)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('COSH',
nil))));
Worksheet.WriteNumber(Row, 2, cosh(value));
// arccosh
inc(Row);
value := 10;
Worksheet.WriteUTF8Text(Row, 0, '=ACOSH(10)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('ACOSH',
nil))));
Worksheet.WriteNumber(Row, 2, arccosh(value));
// tanh
inc(Row);
value := 3;
Worksheet.WriteUTF8Text(Row, 0, '=TANH(3)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('TANH',
nil))));
Worksheet.WriteNumber(Row, 2, tanh(value));
// arctanh =ATANH(0.5)
inc(Row);
value := 0.5;
Worksheet.WriteUTF8Text(Row, 0, Format('=ATANH(%.1f)', [value], fs));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('ATANH',
nil))));
Worksheet.WriteNumber(Row, 2, arctanh(value));
end;
// sqrt(2.0);
inc(Row);
value := 2.0;
Worksheet.WriteUTF8Text(Row, 0, '=SQRT(2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('SQRT',
nil))));
Worksheet.WriteNumber(Row, 2, sqrt(value));
// exp(2)
inc(Row);
value := 2.0;
Worksheet.WriteUTF8Text(Row, 0, '=EXP(2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('EXP',
nil))));
Worksheet.WriteNumber(Row, 2, exp(value));
// ln(2)
inc(Row);
value := 2.0;
Worksheet.WriteUTF8Text(Row, 0, '=LN(2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('LN',
nil))));
Worksheet.WriteNumber(Row, 2, ln(value));
// log to any basis =LOG(256, 2)
inc(Row);
value := 256;
Worksheet.WriteUTF8Text(Row, 0, Format('=LOG(256%s 2)', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNNumber(2,
RPNFunc('LOG', 2,
nil)))));
Worksheet.WriteNumber(Row, 2, logn(2.0, value));
// log10(100)
inc(Row);
value := 100;
Worksheet.WriteUTF8Text(Row, 0, '=LOG10(100)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('LOG10',
nil))));
Worksheet.WriteNumber(Row, 2, log10(value));
// log10(0.01)
inc(Row);
value := 0.01;
Worksheet.WriteUTF8Text(Row, 0, Format('=LOG10(%.2f)', [value], fs));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNFunc('LOG10',
nil))));
Worksheet.WriteNumber(Row, 2, log10(value));
{ ---------- }
inc(Row);
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'Rounding');
Worksheet.WriteFont(Row, 0, BOLD_FONTINDEX);
// Round positive number to 1 decimal =ROUND($F$1, 1)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=ROUND($F$1%s 1)', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$F$1',
RPNNumber(1,
RPNFunc('ROUND',
nil)))));
Worksheet.WriteNumber(Row, 2, Round(cellF1*10)/10); //RoundTo(cellF1, 1));
// Round negative number to 1 decimal =ROUND(G1, 1)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=ROUND(G1%s 1)', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1',
RPNNumber(1,
RPNFunc('ROUND',
nil)))));
Worksheet.WriteNumber(Row, 2, Round(cellG1*10)/10); //RoundTo(cellG1, 1));
// integer part of positive number
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=INT(F1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('F1',
RPNFunc('INT',
nil))));
Worksheet.WriteNumber(Row, 2, trunc(cellF1));
// integer part of negative number
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=INT(G1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1',
RPNFunc('INT',
nil))));
Worksheet.WriteNumber(Row, 2, floor(cellG1)); // is this true?
(*
{ ---------- }
inc(Row);
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'Lookup/reference functions');
Worksheet.WriteUsedFormatting(Row, 0, [uffBold]);
// Column of cell
inc(Row);
cellAddr := 'AB100';
Worksheet.WriteUTF8Text(Row, 0, Format('=COLUMN(%s)',[cellAddr]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRef(cellAddr, // note: CellRef instead of CellValue!
RPNFunc(fekCOLUMN, 1,
nil))));
ParseCellString(cellAddr, r,c);
Worksheet.WriteNumber(Row, 2, c+1); // +1 because Excel index is 1-based
// Column count of cell block
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=COLUMNS(A1:C5)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRange('A1:C5',
RPNFunc(fekCOLUMNS,
nil))));
ParseCellString(cellAddr, r,c);
Worksheet.WriteNumber(Row, 2, 3);
// Row count of cell block
// Row of cell
inc(Row);
cellAddr := 'AB100';
Worksheet.WriteUTF8Text(Row, 0, Format('=ROW(%s)', [cellAddr]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRef(cellAddr, // note: CellRef instead of CellValue!
RPNFunc(fekROW, 1,
nil))));
ParseCellString(cellAddr, r,c);
Worksheet.WriteNumber(Row, 2, r+1); // +1 because Excel index is 1-based
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ROWS(A1:C5)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRange('A1:C5',
RPNFunc(fekROWS,
nil))));
ParseCellString(cellAddr, r,c);
Worksheet.WriteNumber(Row, 2, 5);
{ ---------- }
inc(Row);
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'Info functions');
Worksheet.WriteUsedFormatting(Row, 0, [uffBold]);
// Note: looks as if some of these functions are not updated when loading.
// Press F2 and ENTER for each formula cell
// Cell is blank
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISBLANK(G1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1',
RPNFunc(fekIsBLANK,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'FALSE');
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISBLANK(G2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G2',
RPNFunc(fekIsBLANK,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'TRUE');
// Cell is in error
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISERR(G1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1',
RPNFunc(fekIsERR,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'FALSE');
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISERR(G2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G2',
RPNFunc(fekIsERR,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'FALSE');
// Cell is in error
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISERROR(G1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1',
RPNFunc(fekIsERROR,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'FALSE');
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISERROR(G2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G2',
RPNFunc(fekIsERROR,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'FALSE');
// Cell is logical
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISLOGICAL(B30)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B30',
RPNFunc(fekIsLOGICAL,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'TRUE');
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISLOGICAL(G1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1',
RPNFunc(fekIsLOGICAL,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'FALSE');
// Cell has #N/A error
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISNA(G1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1',
RPNFunc(fekIsNA,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'FALSE');
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISNA(G2)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G2',
RPNFunc(fekIsNA,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'FALSE');
// Cell is number
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISNUMBER(A1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('A1',
RPNFunc(fekIsNUMBER,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'FALSE');
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISNUMBER(G1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1',
RPNFunc(fekIsNUMBER,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'TRUE');
// Cell is refence
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISREF(B9)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B9',
RPNFunc(fekIsREF,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'TRUE');
// Cell is text
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISTEXT(A1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('A1',
RPNFunc(fekIsTEXT,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'TRUE');
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISTEXT(G1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1',
RPNFunc(fekIsTEXT,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'FALSE');
// Cell is non-text
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISNONTEXT(A1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('A1',
RPNFunc(fekIsNONTEXT,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'FALSE');
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=ISNONTEXT(G1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('G1',
RPNFunc(fekIsNONTEXT,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'TRUE');
// Cell information =CELL("Address", B80)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=CELL("Address"%s B80)', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('Address',
RPNCellRef('B80', // note: CellRef instead of CellValue!
RPNFunc(fekCELLINFO, 2,
nil)))));
inc(Row); // =CELL("Filename", B80)
Worksheet.WriteUTF8Text(Row, 0, Format('=CELL("Filename"%s B80)', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('Filename',
RPNCellRef('B80', // note: CellRef instead of CellValue!
RPNFunc(fekCELLINFO, 2,
nil)))));
inc(Row); // =CELL("Row", B80)
Worksheet.WriteUTF8Text(Row, 0, Format('=CELL("Row"%s B80)',[ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('Row',
RPNCellRef('B80', // note: CellRef instead of CellValue!
RPNFunc(fekCELLINFO, 2,
nil)))));
inc(Row); // =CELL("format", B80)
Worksheet.WriteUTF8Text(Row, 0, Format('=CELL("format"%s B80)', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('format',
RPNCellRef('B80', // note: CellRef instead of CellValue!
RPNFunc(fekCELLINFO, 2,
nil)))));
inc(Row); // =CELL("color", B80)
Worksheet.WriteUTF8Text(Row, 0, Format('=CELL("color"%s B80)',[ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('color',
RPNCellRef('B80', // note: CellRef instead of CellValue!
RPNFunc(fekCELLINFO, 2,
nil)))));
// Value of cell - only for strings which can be converted to numbers
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=VALUE(B1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('B1',
RPNFunc(fekVALUE,
nil))));
Worksheet.WriteNumber(Row, 2, cellB1);
// General info
if AFormat <> sfExcel2 then begin
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=INFO("osversion")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('osversion',
RPNFunc(fekINFO,
nil))));
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=INFO("recalc")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('recalc',
RPNFunc(fekINFO,
nil))));
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=INFO("release")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('release',
RPNFunc(fekINFO,
nil))));
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=INFO("system")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('system',
RPNFunc(fekINFO,
nil))));
end;
{ ---------- }
inc(Row);
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'Date/time functions');
Worksheet.WriteUsedFormatting(Row, 0, [uffBold]);
// Now
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=NOW()');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNFunc(fekNOW,
nil)));
Worksheet.WriteNumber(Row, 2, now);
// Today
if AFormat <> sfExcel2 then begin
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=TODAY()');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNFunc(fekTODAY,
nil)));
Worksheet.WriteNumber(Row, 2, date);
end;
// Date (build date from parts)
inc(Row); // =DATE(2014, 1, 25)
Worksheet.WriteUTF8Text(Row, 0, Format('=DATE(2014%s 1%s 25)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(2014,
RPNNumber(1,
RPNNumber(25,
RPNFunc(fekDATE,
nil))))));
Worksheet.WriteNumber(Row, 2, EncodeDate(2014,1,25));
// DateValue (string to date number)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=DATEVALUE("2014-01-25")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('2014-01-25',
RPNFunc(fekDATEVALUE,
nil))));
Worksheet.WriteNumber(Row, 2, EncodeDate(2014,1,25));
// DateDifference
if AFormat >= sfExcel5 then begin
inc(Row); //=DATEDIF("2010-01-01", DATE(2014, 1, 25), "M")
Worksheet.WriteUTF8Text(Row, 0, Format('=DATEDIF("2010-01-01"%s DATE(2014%s 1%s 25)%s "M")', [ls, ls, ls, ls]));
// Note: Dates must be ordered: Date1 < Date2 !!!
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('2010-01-01',
RPNNumber(2014,
RPNNumber(1,
RPNNumber(25,
RPNFunc(fekDATE,
RPNString('M',
RPNFunc(fekDATEDIF,
nil)))))))));
Worksheet.WriteUTF8Text(Row, 2, '(not available in FPC)');
end;
// Year
inc(Row); // =YEAR(DATE(2014, 1, 25))
Worksheet.WriteUTF8Text(Row, 0, Format('=YEAR(DATE(2014%s 1%s 25))', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(2014,
RPNNumber(1,
RPNNumber(25,
RPNFunc(fekDATE,
RPNFunc(fekYEAR,
nil)))))));
Worksheet.WriteNumber(Row, 2, 2014);
// Month
inc(Row); // =MONTH(DATE(2014, 1, 25))
Worksheet.WriteUTF8Text(Row, 0, Format('=MONTH(DATE(2014%s 1%s 25))', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(2014,
RPNNumber(1,
RPNNumber(25,
RPNFunc(fekDATE,
RPNFunc(fekMONTH,
nil)))))));
Worksheet.WriteNumber(Row, 2, 1);
// Day
inc(Row); // =DAY(DATE(2014, 1, 25))
Worksheet.WriteUTF8Text(Row, 0, Format('=DAY(DATE(2014%s 1%s 25))', [ls,ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(2014,
RPNNumber(1,
RPNNumber(25,
RPNFunc(fekDATE,
RPNFunc(fekDAY,
nil)))))));
Worksheet.WriteNumber(Row, 2, 25);
// Weekday - 2 params can be used, but not in BIFF2
inc(Row); // =WEEKDAY(DATE(2014,1,25))
Worksheet.WriteUTF8Text(Row, 0, Format('=WEEKDAY(DATE(2014%s 1%s 25))', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(2014,
RPNNumber(1,
RPNNumber(25,
RPNFunc(fekDATE,
RPNFunc(fekWEEKDAY, 1,
nil)))))));
Worksheet.WriteNumber(Row, 2, DayOfWeek(EncodeDate(2014,1,25)));
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=WEEKDAY("2014-01-25")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('2014-01-25',
RPNFunc(fekWEEKDAY, 1,
nil))));
Worksheet.WriteNumber(Row, 2, DayOfWeek(EncodeDate(2014,1,25)));
// Time (build time from parts)
inc(Row); // =TIME(21,10,5)
Worksheet.WriteUTF8Text(Row, 0, Format('=TIME(21%s 10%s 5)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(21,
RPNNumber(10,
RPNNumber(5,
RPNFunc(fekTIME,
nil))))));
Worksheet.WriteNumber(Row, 2, EncodeTime(21, 10, 5, 0));
// Time value (convert string to time number)
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=TIMEVALUE("21:10:05")');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString('21:10:05',
RPNFunc(fekTIMEVALUE,
nil))));
Worksheet.WriteNumber(Row, 2, EncodeTime(21, 10, 5, 0));
// Hour
inc(Row); // =HOUR(TIME(21, 10, 5))
Worksheet.WriteUTF8Text(Row, 0, Format('=HOUR(TIME(21%s 10%s 5))', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(21,
RPNNumber(10,
RPNNumber(5,
RPNFunc(fekTIME,
RPNFunc(fekHOUR,
nil)))))));
Worksheet.WriteNumber(Row, 2, 21);
// Minute
inc(Row); // =MINUTE(TIME(21, 10, 5))
Worksheet.WriteUTF8Text(Row, 0, Format('=MINUTE(TIME(21%s 10%s 5))', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(21,
RPNNumber(10,
RPNNumber(5,
RPNFunc(fekTIME,
RPNFunc(fekMINUTE,
nil)))))));
Worksheet.WriteNumber(Row, 2, 10);
// Second
inc(Row); // =SECOND(TIME(21, 10, 5))
Worksheet.WriteUTF8Text(Row, 0, Format('=SECOND(TIME(21%s 10%s 5))', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(21,
RPNNumber(10,
RPNNumber(5,
RPNFunc(fekTIME,
RPNFunc(fekSECOND,
nil)))))));
Worksheet.WriteNumber(Row, 2, 5);
{ ---------- }
inc(Row);
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'Statistical functions');
Worksheet.WriteUsedFormatting(Row, 0, [uffBold]);
// Count - non-empty cells
inc(Row); // =COUNT($B$1, $C$1, $D$1:F1)
Worksheet.WriteUTF8Text(Row, 0, Format('=COUNT($B$1%s $C$1%s $D$1:F1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:F1',
RPNFunc(fekCOUNT, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, 5); // 5 cells in total, all not empty
// Count - with empty cells & alpha-numeric cells
inc(Row); // =COUNT($B$1, $C$1, $D$1:$F$2, "ABC")
Worksheet.WriteUTF8Text(Row, 0, Format('=COUNT($B$1%s $C$1%s $D$1:$F$2%s "ABC")', [ls, ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$2',
RPNString('ABC',
RPNFunc(fekCOUNT, 4,
nil)))))));
Worksheet.WriteNumber(Row, 2, 5); // 5 non-empty, 3 empty
// CountA - empty cells and constants
inc(Row); //=COUNTA($B$1, $C$1, D$1:$F$2, "ABC", "DEF")
Worksheet.WriteUTF8Text(Row, 0, Format('=COUNTA($B$1%s $C$1%s $D$1:$F$2%s "ABC"%s "DEF")', [ls, ls, ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$2', //0,3, 1,5, false,false, false,false,
RPNString('ABC',
RPNString('DEF',
RPNFunc(fekCOUNTA, 5,
nil))))))));
Worksheet.WriteNumber(Row, 2, 7); // 7 non-empty values
if AFormat <> sfExcel2 then begin
// CountIF
inc(Row); // =COUNTIF(A1:G1, "<=1")
Worksheet.WriteUTF8Text(Row, 0, Format('=COUNTIF(A1:G1%s "<=1")', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRange('A1:G1',
RPNString('<=1',
RPNFunc(fekCOUNTIF, 2,
nil)))));
Worksheet.WriteNumber(Row, 2,
IfThen(cellB1<=1, 1, 0) + IfThen(cellC1<=1, 1, 0) +
IfThen(cellD1<=1, 1, 0) + IfThen(cellE1<=1, 1, 0) +
IfThen(cellF1<=1, 1, 0) + IfThen(cellG1<=1, 1, 0)
);
// Count blank cells
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=COUNTBLANK(A1:H1)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRange('A1:H1',
RPNFunc(fekCOUNTBLANK,
nil))));
Worksheet.WriteNumber(Row, 2, 1);
end;
// Sum - non-empty cells
inc(Row); // =SUM($B$1, $C$1, D$1:F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=SUM($B$1%s $C$1%s D$1:F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('D$1:F$1',
RPNFunc(fekSUM, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, cellB1+cellC1+cellD1+cellE1+cellF1);
if AFormat <> sfExcel2 then begin
// SumIF
inc(Row); // =SUMIF(A1:G1, "<=1")
Worksheet.WriteUTF8Text(Row, 0, Format('=SUMIF(A1:G1%s "<=1")', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellRange('A1:G1',
RPNString('<=1',
RPNFunc(fekSUMIF, 2,
nil)))));
Worksheet.WriteNumber(Row, 2,
IfThen(cellB1<=1, cellB1, 0) + IfThen(cellC1<=1, cellC1, 0) +
IfThen(cellD1<=1, cellD1, 0) + IfThen(cellE1<=1, cellE1, 0) +
IfThen(cellF1<=1, cellF1, 0) + IfThen(cellG1<=1, cellG1, 0)
);
// Sum of squares
inc(Row); // =SUMSQ($B$1, $C$1, $D$1:$F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=SUMSQ($B$1%s $C$1%s $D$1:$F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$1',
RPNFunc(fekSUMSQ, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, sumofsquares([cellB1, cellC1, cellD1, cellE1, cellF1]));
end;
// Product
inc(Row); // =PRODUCT($B$1, $C$1, $D$1:$F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=PRODUCT($B$1%s $C$1%s $D$1:$F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$1',
RPNFunc(fekPRODUCT, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, cellB1*cellC1*cellD1*cellE1*cellF1);
// Average - non-empty cells
inc(Row); // =AVERAGE($B$1, $C$1, $D$1:$F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=AVERAGE($B$1%s $C$1%s $D$1:$F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$1',
RPNFunc(fekAVERAGE, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, (cellB1+cellC1+cellD1+cellE1+cellF1)/5);
// StdDev
inc(Row); // =STDEV($B$1, $C$1, $D$1:$F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=STDEV($B$1%s $C$1%s $D$1:$F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$1',
RPNFunc(fekSTDEV, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, stddev([cellB1,cellC1,cellD1,cellE1,cellF1]));
// Population StdDev
inc(Row); // =STDEVP($B$1, $C$1, $D$1:$F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=STDEVP($B$1%s $C$1%s $D$1:$F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$1',
RPNFunc(fekSTDEVP, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, popnstddev([cellB1,cellC1,cellD1,cellE1,cellF1]));
// Average deviation
if AFormat <> sfExcel2 then begin
inc(Row); // =AVEDEV($B$1, $C$1, $D$1:$F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=AVEDEV($B$1%s $C$1%s $D$1:$F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$1',
RPNFunc(fekAVEDEV, 3,
nil))))));
value := mean([cellB1, cellC1, cellD1, cellE1, cellF1]);
Worksheet.WriteNumber(Row, 2, mean([abs(cellB1-value),abs(cellC1-value),
abs(cellD1-value),abs(cellE1-value),abs(cellF1-value)]));
end;
// Variance
inc(Row); // =VAR($B$1, $C$1, $D$1:$F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=VAR($B$1%s $C$1%s $D$1:$F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$1',
RPNFunc(fekVAR, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, variance([cellB1,cellC1,cellD1,cellE1,cellF1]));
// Population variance
inc(Row); // =VARP($B$1, $C$1, $D$1:$F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=VARP($B$1%s $C$1%s $D$1:$F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$1',
RPNFunc(fekVARP, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, popnvariance([cellB1,cellC1,cellD1,cellE1,cellF1]));
// Max
inc(Row); // =MAX($B$1, $C$1, $D$1:$F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=MAX($B$1%s $C$1%s $D$1:$F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$1',
RPNFunc(fekMAX, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, MaxValue([cellB1,cellC1,cellD1,cellE1,cellF1]));
// Min
inc(Row); // =MIN($B$1, $C$1, $D$1:$F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=MIN($B$1%s $C$1%s $D$1:$F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$1',
RPNFunc(fekMIN, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, MinValue([cellB1,cellC1,cellD1,cellE1,cellF1]));
// Median
if AFormat <> sfExcel2 then begin
inc(Row); // =MEDIAN($B$1, $C$1, $D$1:$F$1)
Worksheet.WriteUTF8Text(Row, 0, Format('=MEDIAN($B$1%s $C$1%s $D$1:$F$1)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNCellValue('$B$1',
RPNCellValue('$C$1',
RPNCellRange('$D$1:$F$1',
RPNFunc(fekMEDIAN, 3,
nil))))));
Worksheet.WriteNumber(Row, 2, cellF1); // manually calculated median...
end;
// Beta distribution
if AFormat <> sfExcel2 then begin
inc(Row); // =BETADIST(3, 7, 9, 1, 4)
value := 7.5;
Worksheet.WriteUTF8Text(Row, 0, Format('=BETADIST(3%s %.1f%s 9%s 1%s 4)', [ls, value, ls, ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3,
RPNNumber(value,
RPNNumber(9,
RPNNumber(1,
RPNNumber(4,
RPNFunc(fekBETADIST, 5,
nil))))))));
Worksheet.WriteNumber(Row, 2, 0.960370937); // result according to http://www.techonthenet.com/excel/formulas/betadist.php
end;
// Inverse beta function
if AFormat <> sfExcel2 then begin
inc(Row);
value := 0.5; // =BETAINV(0.5, 7, 9, 1, 4)
Worksheet.WriteUTF8Text(Row, 0, Format('=BETAINV(%.1f%s 7%s 9%s 1%s 4)', [value, ls, ls, ls, ls], fs));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(value,
RPNNumber(7,
RPNNumber(9,
RPNNumber(1,
RPNNumber(4,
RPNFunc(fekBETAINV, 5,
nil))))))));
Worksheet.WriteNumber(Row, 2, 2.304498434); // Result calculated by Excel
end;
// Binomial distribution
if AFormat <> sfExcel2 then begin
inc(Row);
value := 0.5; // =BINOMDIST(3, 8, 0.5, TRUE)
Worksheet.WriteUTF8Text(Row, 0, Format('=BINOMDIST(3%s 8%s %.1f%s TRUE)', [ls, ls, value, ls], fs));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3,
RPNNumber(8,
RPNNumber(0.5,
RPNBool(true,
RPNFunc(fekBINOMDIST,
nil)))))));
Worksheet.WriteNumber(Row, 2, 0.36328125); // Result calculated by Excel
end;
// Chi2 distribution
if AFormat <> sfExcel2 then begin
inc(Row); // =CHIDIST(3,9)
Worksheet.WriteUTF8Text(Row, 0, Format('=CHIDIST(3%s 9)', [ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3,
RPNNumber(9,
RPNFunc(fekCHIDIST,
nil)))));
Worksheet.WriteNumber(Row, 2, 0.964294973); // result according to http://www.techonthenet.com/excel/formulas/chidist.php
end;
// Inverse of Chi2 distribution
if AFormat <> sfExcel2 then begin
inc(Row);
value := 0.5; // '=CHIINV(0.5, 7)
Worksheet.WriteUTF8Text(Row, 0, Format('=CHIINV(%.1f%s 7)', [value, ls], fs));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(0.5,
RPNNumber(7,
RPNFunc(fekCHIINV,
nil)))));
Worksheet.WriteNumber(Row, 2, 6.345811373); // Result calculated by Excel
end;
// Permutations
if AFormat <> sfExcel2 then begin
inc(Row); // =PERMUT(21, 5)
Worksheet.WriteUTF8Text(Row, 0, Format('=PERMUT(21%s 5)',[ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(21,
RPNNumber(5,
RPNFunc(fekPERMUT,
nil)))));
Worksheet.WriteNumber(Row, 2, 2441880); // result according to http://www.techonthenet.com/excel/formulas/permut.php
end;
// Poisson distribution
if AFormat <> sfExcel2 then begin
inc(Row); // =POISSON(1400, 1500, TRUE)
Worksheet.WriteUTF8Text(Row, 0, Format('=POISSON(1400%s 1500%s TRUE)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1400,
RPNNumber(1500,
RPNBool(true,
RPNFunc(fekPOISSON,
nil))))));
Worksheet.WriteNumber(Row, 2, 0.004744099); // result according to http://support.microsoft.com/kb/828130/de
end;
{ ---------- }
inc(Row);
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'Financial');
Worksheet.WriteUsedFormatting(Row, 0, [uffBold]);
// Future value of an investment where you deposit $5,000 into a savings account
// that earns 3.5% annually. You are going to deposit $250 at the beginning of
// the month, each month, for 2 years.
// according to: www.techonthenet.com/excel/formulas/fv.php
inc(Row); // =FV(3%/12, 2*12, -250, -5000, 1)
Worksheet.WriteUTF8Text(Row, 0, Format('=FV(3%%/12%s 2*12%s -250%s -5000%s 1)', [ls, ls, ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3,
RPNFunc(fekPERCENT,
RPNNumber(12,
RPNFunc(fekDIV,
RPNNumber(2,
RPNNumber(12,
RPNFunc(fekMUL,
RPNNumber(-250,
RPNNumber(-5000,
RPNNumber(1,
RPNFunc(fekFV, 5,
nil)))))))))))));
Worksheet.WriteUTF8Text(Row, 2, '(not available in FPC)');
// Present value of an investment that pays $250 at the end of every month for
// 2 years. The money paid out will earn 3% annually.
// according to: www.techonthenet.com/excel/formulas/pv.php
// Note the missing argument!
inc(Row); // =PV(3%/12, 2*12, 250, , 0)
Worksheet.WriteUTF8Text(Row, 0, Format('=PV(3%%/12%s 2*12%s 250%s %s 0)', [ls, ls, ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3,
RPNFunc(fekPercent,
RPNNumber(12,
RPNFunc(fekDIV,
RPNNumber(2,
RPNNumber(12,
RPNFunc(fekMUL,
RPNNumber(250,
RPNMissingArg(
RPNNumber(0,
RPNFunc(fekPV, 5,
nil)))))))))))));
Worksheet.WriteUTF8Text(Row, 2, '(not available in FPC)');
// Interest rate on a $5,000 loan where monthly payments of $250 are made for
// 2 years. All payments are made at the end of the period.
// Adapted from //www.techonthenet.com/excel/formulas/rate.php
inc(Row); // =RATE(2*12, -250, 5000)
Worksheet.WriteUTF8Text(Row, 0, Format('=RATE(2*12%s -250%s 5000)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(2,
RPNNumber(12,
RPNFunc(fekMUL,
RPNNumber(-250,
RPNNumber(5000,
RPNFunc(fekRATE, 3,
nil))))))));
{
Worksheet.WriteUsedFormatting(Row, 1, [uffNumberFormat]);
Worksheet.WriteNumberFormat(Row, 1, nfPercentage);
}
Worksheet.WriteUTF8Text(Row, 2, '(not available in FPC)');
// Number of monthly payments of $150 for a $5,000 investment that earns
// 3.5% annually. Payments are due at the end of the period.
// Adapted from //www.techonthenet.com/excel/formulas/nper.php
inc(Row); // =NPER(3%/12, -150, 5000)
Worksheet.WriteUTF8Text(Row, 0, Format('=NPER(3%%/12%s -150%s 5000)', [ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3,
RPNFunc(fekPERCENT,
RPNNumber(12,
RPNFunc(fekDIV,
RPNNumber(-150,
RPNNumber(5000,
RPNFunc(fekNPER, 3,
nil)))))))));
Worksheet.WriteUTF8Text(Row, 2, '(not available in FPC)');
// Monthly payment on a $5,000 loan at an annual rate of 3.5%. The loan is
// paid off in 2 years (ie: 2 x 12). All payments are made at the beginning
// of the period.
// Adapted from //www.techonthenet.com/excel/formulas/pmt.php
inc(Row); // =PMT(3%/12, 2*12, 5000, 0, 1)
Worksheet.WriteUTF8Text(Row, 0, Format('=PMT(3%%/12%s 2*12%s 5000%s 0%s 1)', [ls, ls, ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(3,
RPNFunc(fekPERCENT,
RPNNumber(12,
RPNFunc(fekDIV,
RPNNumber(2,
RPNNumber(12,
RPNFunc(fekMUL,
RPNNumber(5000,
RPNNumber(0,
RPNNumber(1,
RPNFunc(fekPMT, 5,
nil)))))))))))));
Worksheet.WriteUTF8Text(Row, 2, '(not available in FPC)');
{ ---------- }
inc(Row);
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, 'String functions');
Worksheet.WriteUsedFormatting(Row, 0, [uffBold]);
// Character conversion
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=CHAR(64)');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(64,
RPNFunc(fekCHAR,
nil))));
Worksheet.WriteUTF8Text(Row, 2, chr(64));
// Character conversion
// Note: uses only first character of string
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=CODE("%s")', [SHelloWorld]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld,
RPNFunc(fekCODE,
nil))));
Worksheet.WriteNumber(Row, 2, ord(SHelloWorld[1]));
// Left part of string
inc(Row); // =LEFT("%s", 3)
Worksheet.WriteUTF8Text(Row, 0, Format('=LEFT("%s"%s 3)', [SHelloWorld, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld,
RPNNumber(3,
RPNFunc(fekLEFT, 2,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, Copy(SHelloWorld, 1, 3));
// Mid part of string
inc(Row); // =MID("%s", 4, 5)
Worksheet.WriteUTF8Text(Row, 0, Format('=MID("%s"%s 4%s 5)', [SHelloWorld, ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld,
RPNNumber(4,
RPNNumber(5,
RPNFunc(fekMID,
nil))))));
Worksheet.WriteUTF8Text(Row, 2, Copy(SHelloWorld, 4, 5));
// Right part of string
inc(Row); // =RIGHT("%s", 3)
Worksheet.WriteUTF8Text(Row, 0, Format('=RIGHT("%s"%s 3)', [SHelloWorld, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld,
RPNNumber(3,
RPNFunc(fekRIGHT, 2,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, Copy(SHelloWorld, Length(SHelloWorld)-3+1, 3));
// Trimming spaces
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=TRIM(" %s ")', [SHelloWorld]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(' '+SHelloWorld+' ',
RPNFunc(fekTRIM,
nil))));
Worksheet.WriteUTF8Text(Row, 2, SHelloWorld);
// Lower case
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=LOWER("%s")', [SHelloWorld]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld,
RPNFunc(fekLOWER,
nil))));
Worksheet.WriteUTF8Text(Row, 2, lowercase(SHelloWorld));
// Upper case
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=UPPER("%s")', [SHelloWorld]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld,
RPNFunc(fekUPPER,
nil))));
Worksheet.WriteUTF8Text(Row, 2, uppercase(SHelloWorld));
// 1st char upper case
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, Format('=PROPER("%s")', [uppercase(SHelloWorld)]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(Uppercase(SHelloWorld),
RPNFunc(fekPROPER,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'Hello World!');
// replace
inc(Row); // =REPLACE("%s", 7, 5, "Friend")
Worksheet.WriteUTF8Text(Row, 0, Format('=REPLACE("%s"%s 7%s 5%s "Friend")', [SHelloWorld, ls, ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld,
RPNNumber(7,
RPNNumber(5,
RPNString('Friend',
RPNFunc(fekREPLACE,
nil)))))));
Worksheet.WriteUTF8Text(Row, 2, 'Hello Friend!');
// substitute
// Note: the function can have an optional parameter. Therefore, you have
// to specify the actual parameter count.
inc(Row); // =SUBSTITUTE("%s", "l", ".")
Worksheet.WriteUTF8Text(Row, 0, Format('=SUBSTITUTE("%s"%s "l"%s ".")', [SHelloWorld, ls, ls]));
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNString(SHelloWorld,
RPNString('l',
RPNString('.',
RPNFunc(fekSUBSTITUTE, 3,
nil))))));
Worksheet.WriteUTF8Text(Row, 2, 'He..o Wor.d!');
inc(Row, 2);
Worksheet.WriteUTF8Text(Row, 0, 'Errors');
Worksheet.WriteUsedFormatting(Row, 0, [uffBold]);
if IncludeErrors then begin
// These tests partly produce an error messsage when the file is read by Excel.
// In order to avoid confusion they are deactivated by default.
// Remove the comment below to see these tests.
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=1/0');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1,
RPNNumber(0,
RPNFunc(fekDiv,
nil)))));
Worksheet.WriteUTF8Text(Row, 2, 'Error #DIV/0!');
// Not enough operands for operation
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=#N/A');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1,
// here we'd normally put "RPNNumbe(2," - but we "forget" it...
RPNFunc(fekDiv,
nil))));
Worksheet.WriteUTF8Text(Row, 2, 'Error #N/A"');
Worksheet.WriteUTF8Text(Row, 3, 'Should be "=1/2", but the "2" is forgotten from the formula...');
// Too many operands given
inc(Row);
Worksheet.WriteUTF8Text(Row, 0, '=#N/A');
Worksheet.WriteRPNFormula(Row, 1, CreateRPNFormula(
RPNNumber(1,
RPNNumber(2,
RPNNumber(3, // This line is too much
RPNFunc(fekDiv,
nil))))));
Worksheet.WriteUTF8Text(Row, 2, 'Error #N/A!');
Worksheet.WriteUTF8Text(Row, 3, 'Should be "=1/2", but there are too many operands...');
end;
*)
end;
end.