Skip to content

Commit 5a039f3

Browse files
committed
This fixes qax-os#1658
- Fix a v2.8.0 regression bug, number format code apply result was empty - Fix calculate formula functions CHITEST and MMULT panic in some cases - Updated unit tests
1 parent 49706c9 commit 5a039f3

File tree

4 files changed

+43
-22
lines changed

4 files changed

+43
-22
lines changed

Diff for: calc.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -4803,11 +4803,16 @@ func (fn *formulaFuncs) MMULT(argsList *list.List) formulaArg {
48034803
if argsList.Len() != 2 {
48044804
return newErrorFormulaArg(formulaErrorVALUE, "MMULT requires 2 argument")
48054805
}
4806-
numMtx1, errArg1 := newNumberMatrix(argsList.Front().Value.(formulaArg), false)
4806+
arr1 := argsList.Front().Value.(formulaArg)
4807+
arr2 := argsList.Back().Value.(formulaArg)
4808+
if arr1.Type == ArgNumber && arr2.Type == ArgNumber {
4809+
return newNumberFormulaArg(arr1.Number * arr2.Number)
4810+
}
4811+
numMtx1, errArg1 := newNumberMatrix(arr1, false)
48074812
if errArg1.Type == ArgError {
48084813
return errArg1
48094814
}
4810-
numMtx2, errArg2 := newNumberMatrix(argsList.Back().Value.(formulaArg), false)
4815+
numMtx2, errArg2 := newNumberMatrix(arr2, false)
48114816
if errArg2.Type == ArgError {
48124817
return errArg2
48134818
}
@@ -7191,6 +7196,9 @@ func (fn *formulaFuncs) CHITEST(argsList *list.List) formulaArg {
71917196
actual, expected := argsList.Front().Value.(formulaArg), argsList.Back().Value.(formulaArg)
71927197
actualList, expectedList := actual.ToList(), expected.ToList()
71937198
rows := len(actual.Matrix)
7199+
if rows == 0 {
7200+
return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE)
7201+
}
71947202
columns := len(actualList) / rows
71957203
if len(actualList) != len(expectedList) || len(actualList) == 1 {
71967204
return newErrorFormulaArg(formulaErrorNA, formulaErrorNA)

Diff for: calc_test.go

+13-10
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,8 @@ func TestCalcCellValue(t *testing.T) {
673673
// MINVERSE
674674
"=MINVERSE(A1:B2)": "-0",
675675
// MMULT
676+
"=MMULT(0,0)": "0",
677+
"=MMULT(2,4)": "8",
676678
"=MMULT(A4:A4,A4:A4)": "0",
677679
// MOD
678680
"=MOD(6,4)": "2",
@@ -5139,16 +5141,17 @@ func TestCalcCHITESTandCHISQdotTEST(t *testing.T) {
51395141
assert.Equal(t, expected, result, formula)
51405142
}
51415143
calcError := map[string][]string{
5142-
"=CHITEST()": {"#VALUE!", "CHITEST requires 2 arguments"},
5143-
"=CHITEST(B3:C5,F3:F4)": {"#N/A", "#N/A"},
5144-
"=CHITEST(B3:B3,F3:F3)": {"#N/A", "#N/A"},
5145-
"=CHITEST(F3:F5,B4:B6)": {"#NUM!", "#NUM!"},
5146-
"=CHITEST(F3:F5,C4:C6)": {"#DIV/0!", "#DIV/0!"},
5147-
"=CHISQ.TEST()": {"#VALUE!", "CHISQ.TEST requires 2 arguments"},
5148-
"=CHISQ.TEST(B3:C5,F3:F4)": {"#N/A", "#N/A"},
5149-
"=CHISQ.TEST(B3:B3,F3:F3)": {"#N/A", "#N/A"},
5150-
"=CHISQ.TEST(F3:F5,B4:B6)": {"#NUM!", "#NUM!"},
5151-
"=CHISQ.TEST(F3:F5,C4:C6)": {"#DIV/0!", "#DIV/0!"},
5144+
"=CHITEST()": {"#VALUE!", "CHITEST requires 2 arguments"},
5145+
"=CHITEST(MUNIT(0),MUNIT(0))": {"#VALUE!", "#VALUE!"},
5146+
"=CHITEST(B3:C5,F3:F4)": {"#N/A", "#N/A"},
5147+
"=CHITEST(B3:B3,F3:F3)": {"#N/A", "#N/A"},
5148+
"=CHITEST(F3:F5,B4:B6)": {"#NUM!", "#NUM!"},
5149+
"=CHITEST(F3:F5,C4:C6)": {"#DIV/0!", "#DIV/0!"},
5150+
"=CHISQ.TEST()": {"#VALUE!", "CHISQ.TEST requires 2 arguments"},
5151+
"=CHISQ.TEST(B3:C5,F3:F4)": {"#N/A", "#N/A"},
5152+
"=CHISQ.TEST(B3:B3,F3:F3)": {"#N/A", "#N/A"},
5153+
"=CHISQ.TEST(F3:F5,B4:B6)": {"#NUM!", "#NUM!"},
5154+
"=CHISQ.TEST(F3:F5,C4:C6)": {"#DIV/0!", "#DIV/0!"},
51525155
}
51535156
for formula, expected := range calcError {
51545157
assert.NoError(t, f.SetCellFormula("Sheet1", "I1", formula))

Diff for: numfmt.go

+14-10
Original file line numberDiff line numberDiff line change
@@ -4759,9 +4759,9 @@ func (nf *numberFormat) getNumberFmtConf() {
47594759
if token.TType == nfp.TokenTypeHashPlaceHolder {
47604760
if nf.usePointer {
47614761
nf.fracHolder += len(token.TValue)
4762-
} else {
4763-
nf.intHolder += len(token.TValue)
4762+
continue
47644763
}
4764+
nf.intHolder += len(token.TValue)
47654765
}
47664766
if token.TType == nfp.TokenTypeExponential {
47674767
nf.useScientificNotation = true
@@ -4779,6 +4779,7 @@ func (nf *numberFormat) getNumberFmtConf() {
47794779
nf.switchArgument = token.TValue
47804780
}
47814781
if token.TType == nfp.TokenTypeZeroPlaceHolder {
4782+
nf.intHolder = 0
47824783
if nf.usePointer {
47834784
if nf.useScientificNotation {
47844785
nf.expBaseLen += len(token.TValue)
@@ -4795,7 +4796,7 @@ func (nf *numberFormat) getNumberFmtConf() {
47954796
// printNumberLiteral apply literal tokens for the pre-formatted text.
47964797
func (nf *numberFormat) printNumberLiteral(text string) string {
47974798
var result string
4798-
var useLiteral, useZeroPlaceHolder bool
4799+
var useLiteral, usePlaceHolder bool
47994800
if nf.usePositive {
48004801
result += "-"
48014802
}
@@ -4807,17 +4808,17 @@ func (nf *numberFormat) printNumberLiteral(text string) string {
48074808
result += nf.currencyString
48084809
}
48094810
if token.TType == nfp.TokenTypeLiteral {
4810-
if useZeroPlaceHolder {
4811+
if usePlaceHolder {
48114812
useLiteral = true
48124813
}
48134814
result += token.TValue
48144815
}
4815-
if token.TType == nfp.TokenTypeZeroPlaceHolder {
4816-
if useLiteral && useZeroPlaceHolder {
4816+
if token.TType == nfp.TokenTypeHashPlaceHolder || token.TType == nfp.TokenTypeZeroPlaceHolder {
4817+
if useLiteral && usePlaceHolder {
48174818
return nf.value
48184819
}
4819-
if !useZeroPlaceHolder {
4820-
useZeroPlaceHolder = true
4820+
if !usePlaceHolder {
4821+
usePlaceHolder = true
48214822
result += text
48224823
}
48234824
}
@@ -4896,8 +4897,11 @@ func (nf *numberFormat) numberHandler() string {
48964897
result string
48974898
)
48984899
nf.getNumberFmtConf()
4899-
if intLen = intPart; nf.intPadding > intPart {
4900-
intLen = nf.intPadding
4900+
if nf.intHolder > intPart {
4901+
nf.intHolder = intPart
4902+
}
4903+
if intLen = intPart; nf.intPadding+nf.intHolder > intPart {
4904+
intLen = nf.intPadding + nf.intHolder
49014905
}
49024906
if fracLen = fracPart; fracPart > nf.fracHolder+nf.fracPadding {
49034907
fracLen = nf.fracHolder + nf.fracPadding

Diff for: numfmt_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -3504,6 +3504,12 @@ func TestNumFmt(t *testing.T) {
35043504
{"1234.5678", "#,##0 ;[red](#,##0)", "1,235 "},
35053505
{"1234.5678", "#,##0.00;(#,##0.00)", "1,234.57"},
35063506
{"1234.5678", "#,##0.00;[red](#,##0.00)", "1,234.57"},
3507+
{"1234.5678", "#", "1235"},
3508+
{"1234.5678", "#0", "1235"},
3509+
{"1234.5678", "##", "1235"},
3510+
{"1234.5678", "00000.00#", "01234.568"},
3511+
{"1234.5678", "00000####", "000001235"},
3512+
{"1234.5678", "00000######", "000001235"},
35073513
{"-1234.5678", "0.00", "-1234.57"},
35083514
{"-1234.5678", "0.00;-0.00", "-1234.57"},
35093515
{"-1234.5678", "0.00%%", "-12345678.00%%"},

0 commit comments

Comments
 (0)