Skip to content

Commit 5975d87

Browse files
This closes #1851, and closes #1856 fix formula calculation result round issue (#1860)
- The SetSheetName function now support case sensitivity - Update unit tests
1 parent 9e884c7 commit 5975d87

File tree

4 files changed

+36
-15
lines changed

4 files changed

+36
-15
lines changed

calc.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -831,16 +831,18 @@ func (f *File) CalcCellValue(sheet, cell string, opts ...Options) (result string
831831
if !rawCellValue {
832832
styleIdx, _ = f.GetCellStyle(sheet, cell)
833833
}
834-
result = token.Value()
835-
if isNum, precision, decimal := isNumeric(result); isNum && !rawCellValue {
834+
if token.Type == ArgNumber && !token.Boolean {
835+
_, precision, decimal := isNumeric(token.Value())
836836
if precision > 15 {
837837
result, err = f.formattedValue(&xlsxC{S: styleIdx, V: strings.ToUpper(strconv.FormatFloat(decimal, 'G', 15, 64))}, rawCellValue, CellTypeNumber)
838838
return
839839
}
840840
if !strings.HasPrefix(result, "0") {
841841
result, err = f.formattedValue(&xlsxC{S: styleIdx, V: strings.ToUpper(strconv.FormatFloat(decimal, 'f', -1, 64))}, rawCellValue, CellTypeNumber)
842842
}
843+
return
843844
}
845+
result, err = f.formattedValue(&xlsxC{S: styleIdx, V: token.Value()}, rawCellValue, CellTypeInlineString)
844846
return
845847
}
846848

@@ -4281,7 +4283,7 @@ func (fn *formulaFuncs) EXP(argsList *list.List) formulaArg {
42814283
if number.Type == ArgError {
42824284
return number
42834285
}
4284-
return newStringFormulaArg(strings.ToUpper(fmt.Sprintf("%g", math.Exp(number.Number))))
4286+
return newNumberFormulaArg(math.Exp(number.Number))
42854287
}
42864288

42874289
// fact returns the factorial of a supplied number.
@@ -4359,7 +4361,7 @@ func (fn *formulaFuncs) FLOOR(argsList *list.List) formulaArg {
43594361
val--
43604362
}
43614363
}
4362-
return newStringFormulaArg(strings.ToUpper(fmt.Sprintf("%g", val*significance.Number)))
4364+
return newNumberFormulaArg(val * significance.Number)
43634365
}
43644366

43654367
// FLOORdotMATH function rounds a supplied number down to a supplied multiple
@@ -11570,12 +11572,10 @@ func (fn *formulaFuncs) ISNA(argsList *list.List) formulaArg {
1157011572
if argsList.Len() != 1 {
1157111573
return newErrorFormulaArg(formulaErrorVALUE, "ISNA requires 1 argument")
1157211574
}
11573-
token := argsList.Front().Value.(formulaArg)
11574-
result := "FALSE"
11575-
if token.Type == ArgError && token.String == formulaErrorNA {
11576-
result = "TRUE"
11575+
if token := argsList.Front().Value.(formulaArg); token.Type == ArgError && token.String == formulaErrorNA {
11576+
return newBoolFormulaArg(true)
1157711577
}
11578-
return newStringFormulaArg(result)
11578+
return newBoolFormulaArg(false)
1157911579
}
1158011580

1158111581
// ISNONTEXT function tests if a supplied value is text. If not, the

calc_test.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6311,13 +6311,31 @@ func TestFormulaRawCellValueOption(t *testing.T) {
63116311
raw bool
63126312
expected string
63136313
}{
6314-
{"=\"10e3\"", false, "10000"},
6314+
{"=VALUE(\"1.0E-07\")", false, "0.00"},
6315+
{"=VALUE(\"1.0E-07\")", true, "0.0000001"},
6316+
{"=\"text\"", false, "$text"},
6317+
{"=\"text\"", true, "text"},
6318+
{"=\"10e3\"", false, "$10e3"},
63156319
{"=\"10e3\"", true, "10e3"},
6316-
{"=\"10\" & \"e3\"", false, "10000"},
6320+
{"=\"10\" & \"e3\"", false, "$10e3"},
63176321
{"=\"10\" & \"e3\"", true, "10e3"},
6318-
{"=\"1111111111111111\"", false, "1.11111111111111E+15"},
6322+
{"=10e3", false, "10000.00"},
6323+
{"=10e3", true, "10000"},
6324+
{"=\"1111111111111111\"", false, "$1111111111111111"},
63196325
{"=\"1111111111111111\"", true, "1111111111111111"},
6320-
}
6326+
{"=1111111111111111", false, "1111111111111110.00"},
6327+
{"=1111111111111111", true, "1.11111111111111E+15"},
6328+
{"=1444.00000000003", false, "1444.00"},
6329+
{"=1444.00000000003", true, "1444.00000000003"},
6330+
{"=1444.000000000003", false, "1444.00"},
6331+
{"=1444.000000000003", true, "1444"},
6332+
{"=ROUND(1444.00000000000003,2)", false, "1444.00"},
6333+
{"=ROUND(1444.00000000000003,2)", true, "1444"},
6334+
}
6335+
exp := "0.00;0.00;;$@"
6336+
styleID, err := f.NewStyle(&Style{CustomNumFmt: &exp})
6337+
assert.NoError(t, err)
6338+
assert.NoError(t, f.SetCellStyle("Sheet1", "A1", "A1", styleID))
63216339
for _, test := range rawTest {
63226340
assert.NoError(t, f.SetCellFormula("Sheet1", "A1", test.value))
63236341
val, err := f.CalcCellValue("Sheet1", "A1", Options{RawCellValue: test.raw})

sheet.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ func (f *File) SetSheetName(source, target string) error {
363363
if err = checkSheetName(target); err != nil {
364364
return err
365365
}
366-
if strings.EqualFold(target, source) {
366+
if target == source {
367367
return err
368368
}
369369
wb, _ := f.workbookReader()

sheet_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,8 +465,11 @@ func TestSetSheetName(t *testing.T) {
465465
// Test set worksheet with the same name
466466
assert.NoError(t, f.SetSheetName("Sheet1", "Sheet1"))
467467
assert.Equal(t, "Sheet1", f.GetSheetName(0))
468+
// Test set worksheet with the different name
469+
assert.NoError(t, f.SetSheetName("Sheet1", "sheet1"))
470+
assert.Equal(t, "sheet1", f.GetSheetName(0))
468471
// Test set sheet name with invalid sheet name
469-
assert.EqualError(t, f.SetSheetName("Sheet:1", "Sheet1"), ErrSheetNameInvalid.Error())
472+
assert.Equal(t, f.SetSheetName("Sheet:1", "Sheet1"), ErrSheetNameInvalid)
470473

471474
// Test set worksheet name with existing defined name and auto filter
472475
assert.NoError(t, f.AutoFilter("Sheet1", "A1:A2", nil))

0 commit comments

Comments
 (0)