From 2d8b5b1885b3d5cd14c974df61a3d0d757efd7bd Mon Sep 17 00:00:00 2001 From: xuri Date: Tue, 28 Sep 2021 22:02:31 +0800 Subject: This closes #1027 and closes #1028 * Fix build-in scientific number format failed * An error will be returned if given an invalid custom number format when creating a new style --- errors.go | 2 ++ styles.go | 5 ++++- styles_test.go | 16 ++++++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/errors.go b/errors.go index 9fc0957..e89fea1 100644 --- a/errors.go +++ b/errors.go @@ -112,6 +112,8 @@ var ( // ErrDefinedNameduplicate defined the error message on the same name // already exists on the scope. ErrDefinedNameduplicate = errors.New("the same name already exists on the scope") + // ErrCustomNumFmt defined the error message on receive the empty parameter. + ErrCustomNumFmt = errors.New("custom number format can not be empty") // ErrFontLength defined the error message on the length of the font // family name overflow. ErrFontLength = errors.New("the length of the font family name must be smaller than or equal to 31") diff --git a/styles.go b/styles.go index e4f3a27..0ae9e51 100644 --- a/styles.go +++ b/styles.go @@ -930,7 +930,7 @@ func formatToE(v string, format string) string { if err != nil { return v } - return fmt.Sprintf("%.e", f) + return fmt.Sprintf("%.2E", f) } // parseTime provides a function to returns a string parsed using time.Time. @@ -1115,6 +1115,9 @@ func parseFormatStyleSet(style interface{}) (*Style, error) { return &fs, ErrFontSize } } + if fs.CustomNumFmt != nil && len(*fs.CustomNumFmt) == 0 { + err = ErrCustomNumFmt + } return &fs, err } diff --git a/styles_test.go b/styles_test.go index 5d452f6..a214aaa 100644 --- a/styles_test.go +++ b/styles_test.go @@ -203,10 +203,13 @@ func TestNewStyle(t *testing.T) { _, err = f.NewStyle(Style{}) assert.EqualError(t, err, ErrParameterInvalid.Error()) + var exp string + _, err = f.NewStyle(&Style{CustomNumFmt: &exp}) + assert.EqualError(t, err, ErrCustomNumFmt.Error()) _, err = f.NewStyle(&Style{Font: &Font{Family: strings.Repeat("s", MaxFontFamilyLength+1)}}) - assert.EqualError(t, err, "the length of the font family name must be smaller than or equal to 31") + assert.EqualError(t, err, ErrFontLength.Error()) _, err = f.NewStyle(&Style{Font: &Font{Size: MaxFontSize + 1}}) - assert.EqualError(t, err, "font size must be between 1 and 409 points") + assert.EqualError(t, err, ErrFontSize.Error()) // new numeric custom style fmt := "####;####" @@ -240,6 +243,15 @@ func TestNewStyle(t *testing.T) { nf = f.Styles.CellXfs.Xf[styleID] assert.Equal(t, 32, *nf.NumFmtID) + + // Test set build-in scientific number format + styleID, err = f.NewStyle(&Style{NumFmt: 11}) + assert.NoError(t, err) + assert.NoError(t, f.SetCellStyle("Sheet1", "A1", "B1", styleID)) + assert.NoError(t, f.SetSheetRow("Sheet1", "A1", &[]float64{1.23, 1.234})) + rows, err := f.GetRows("Sheet1") + assert.NoError(t, err) + assert.Equal(t, [][]string{{"1.23E+00", "1.23E+00"}}, rows) } func TestGetDefaultFont(t *testing.T) { -- cgit v1.2.1