Skip to content

Commit ad85417

Browse files
committed
This closes qax-os#1989, fix incorrect result of formula functions XIRR and XNPV
- Require number data type instead of string - Fix incorrect formula error type
1 parent 8c0ef7f commit ad85417

File tree

2 files changed

+32
-34
lines changed

2 files changed

+32
-34
lines changed

calc.go

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18197,28 +18197,26 @@ func (fn *formulaFuncs) prepareXArgs(values, dates formulaArg) (valuesArg, dates
1819718197
valuesArg = append(valuesArg, numArg.Number)
1819818198
continue
1819918199
}
18200-
err = newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
18200+
err = newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
1820118201
return
1820218202
}
1820318203
if len(valuesArg) < 2 {
1820418204
err = newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
1820518205
return
1820618206
}
18207-
args, date := list.New(), 0.0
18207+
date := 0.0
1820818208
for _, arg := range dates.ToList() {
18209-
args.Init()
18210-
args.PushBack(arg)
18211-
dateValue := fn.DATEVALUE(args)
18212-
if dateValue.Type != ArgNumber {
18213-
err = newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)
18214-
return
18215-
}
18216-
if dateValue.Number < date {
18217-
err = newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
18218-
return
18209+
if arg.Type == ArgNumber {
18210+
datesArg = append(datesArg, arg.Number)
18211+
if arg.Number < date {
18212+
err = newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
18213+
return
18214+
}
18215+
date = arg.Number
18216+
continue
1821918217
}
18220-
datesArg = append(datesArg, dateValue.Number)
18221-
date = dateValue.Number
18218+
err = newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
18219+
return
1822218220
}
1822318221
if len(valuesArg) != len(datesArg) {
1822418222
err = newErrorFormulaArg(formulaErrorNUM, formulaErrorNUM)

calc_test.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5562,13 +5562,13 @@ func TestCalcSUMIFSAndAVERAGEIFS(t *testing.T) {
55625562

55635563
func TestCalcXIRR(t *testing.T) {
55645564
cellData := [][]interface{}{
5565-
{-100.00, "01/01/2016"},
5566-
{20.00, "04/01/2016"},
5567-
{40.00, "10/01/2016"},
5568-
{25.00, "02/01/2017"},
5569-
{8.00, "03/01/2017"},
5570-
{15.00, "06/01/2017"},
5571-
{-1e-10, "09/01/2017"},
5565+
{-100.00, 42370},
5566+
{20.00, 42461},
5567+
{40.00, 42644},
5568+
{25.00, 42767},
5569+
{8.00, 42795},
5570+
{15.00, 42887},
5571+
{-1e-10, 42979},
55725572
}
55735573
f := prepareCalcData(cellData)
55745574
formulaList := map[string]string{
@@ -5584,8 +5584,8 @@ func TestCalcXIRR(t *testing.T) {
55845584
calcError := map[string][]string{
55855585
"=XIRR()": {"#VALUE!", "XIRR requires 2 or 3 arguments"},
55865586
"=XIRR(A1:A4,B1:B4,-1)": {"#VALUE!", "XIRR requires guess > -1"},
5587-
"=XIRR(\"\",B1:B4)": {"#NUM!", "#NUM!"},
5588-
"=XIRR(A1:A4,\"\")": {"#NUM!", "#NUM!"},
5587+
"=XIRR(\"\",B1:B4)": {"#VALUE!", "#VALUE!"},
5588+
"=XIRR(A1:A4,\"\")": {"#VALUE!", "#VALUE!"},
55895589
"=XIRR(A1:A4,B1:B4,\"\")": {"#NUM!", "#NUM!"},
55905590
"=XIRR(A2:A6,B2:B6)": {"#NUM!", "#NUM!"},
55915591
"=XIRR(A2:A7,B2:B7)": {"#NUM!", "#NUM!"},
@@ -5708,15 +5708,15 @@ func TestCalcXLOOKUP(t *testing.T) {
57085708
func TestCalcXNPV(t *testing.T) {
57095709
cellData := [][]interface{}{
57105710
{nil, 0.05},
5711-
{"01/01/2016", -10000, nil},
5712-
{"02/01/2016", 2000},
5713-
{"05/01/2016", 2400},
5714-
{"07/01/2016", 2900},
5715-
{"11/01/2016", 3500},
5716-
{"01/01/2017", 4100},
5711+
{42370, -10000, nil},
5712+
{42401, 2000},
5713+
{42491, 2400},
5714+
{42552, 2900},
5715+
{42675, 3500},
5716+
{42736, 4100},
57175717
{},
5718-
{"02/01/2016"},
5719-
{"01/01/2016"},
5718+
{42401},
5719+
{42370},
57205720
}
57215721
f := prepareCalcData(cellData)
57225722
formulaList := map[string]string{
@@ -5732,9 +5732,9 @@ func TestCalcXNPV(t *testing.T) {
57325732
"=XNPV()": {"#VALUE!", "XNPV requires 3 arguments"},
57335733
"=XNPV(\"\",B2:B7,A2:A7)": {"#VALUE!", "strconv.ParseFloat: parsing \"\": invalid syntax"},
57345734
"=XNPV(0,B2:B7,A2:A7)": {"#VALUE!", "XNPV requires rate > 0"},
5735-
"=XNPV(B1,\"\",A2:A7)": {"#NUM!", "#NUM!"},
5736-
"=XNPV(B1,B2:B7,\"\")": {"#NUM!", "#NUM!"},
5737-
"=XNPV(B1,B2:B7,C2:C7)": {"#NUM!", "#NUM!"},
5735+
"=XNPV(B1,\"\",A2:A7)": {"#VALUE!", "#VALUE!"},
5736+
"=XNPV(B1,B2:B7,\"\")": {"#VALUE!", "#VALUE!"},
5737+
"=XNPV(B1,B2:B7,C2:C7)": {"#VALUE!", "#VALUE!"},
57385738
"=XNPV(B1,B2,A2)": {"#NUM!", "#NUM!"},
57395739
"=XNPV(B1,B2:B3,A2:A5)": {"#NUM!", "#NUM!"},
57405740
"=XNPV(B1,B2:B3,A9:A10)": {"#VALUE!", "#VALUE!"},

0 commit comments

Comments
 (0)