Browse Source

SetCellFloat for floats with specific precision (#361)

This allows the user to set a floating point value into a
cell with a specific number of places after the decimal.

Closes #357
Michael 6 years ago
parent
commit
b2c12d784e
2 changed files with 49 additions and 2 deletions
  1. 17 2
      cell.go
  2. 32 0
      cell_test.go

+ 17 - 2
cell.go

@@ -91,9 +91,9 @@ func (f *File) SetCellValue(sheet, axis string, value interface{}) {
 	case uint64:
 	case uint64:
 		f.SetCellInt(sheet, axis, int(v))
 		f.SetCellInt(sheet, axis, int(v))
 	case float32:
 	case float32:
-		f.SetCellDefault(sheet, axis, strconv.FormatFloat(float64(v), 'f', -1, 32))
+		f.SetCellFloat(sheet, axis, float64(v), -1, 32)
 	case float64:
 	case float64:
-		f.SetCellDefault(sheet, axis, strconv.FormatFloat(v, 'f', -1, 64))
+		f.SetCellFloat(sheet, axis, v, -1, 64)
 	case string:
 	case string:
 		f.SetCellStr(sheet, axis, v)
 		f.SetCellStr(sheet, axis, v)
 	case []byte:
 	case []byte:
@@ -142,6 +142,21 @@ func (f *File) SetCellBool(sheet, axis string, value bool) {
 	}
 	}
 }
 }
 
 
+// SetCellFloat sets a floating point value into a cell. The prec parameter
+// specifies how many places after the decimal will be shown while -1
+// is a special value that will use as many decimal places as necessary to
+// represent the number. bitSize is 32 or 64 depending on if a float32 or float64
+// was originally used for the value
+//     var x float32 = 1.325
+//     f.SetCellFloat("Sheet1", "A1", float64(x), 2, 32)
+func (f *File) SetCellFloat(sheet, axis string, value float64, prec, bitSize int) {
+	xlsx := f.workSheetReader(sheet)
+	cellData, col, _ := f.prepareCell(xlsx, sheet, axis)
+	cellData.S = f.prepareCellStyle(xlsx, col, cellData.S)
+	cellData.T = ""
+	cellData.V = strconv.FormatFloat(value, 'f', prec, 64)
+}
+
 // SetCellStr provides a function to set string type value of a cell. Total
 // SetCellStr provides a function to set string type value of a cell. Total
 // number of characters that a cell can contain 32767 characters.
 // number of characters that a cell can contain 32767 characters.
 func (f *File) SetCellStr(sheet, axis, value string) {
 func (f *File) SetCellStr(sheet, axis, value string) {

+ 32 - 0
cell_test.go

@@ -1,6 +1,7 @@
 package excelize
 package excelize
 
 
 import (
 import (
+	"fmt"
 	"testing"
 	"testing"
 
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/assert"
@@ -39,3 +40,34 @@ func TestCheckCellInArea(t *testing.T) {
 		checkCellInArea("AA0", "Z0:AB1")
 		checkCellInArea("AA0", "Z0:AB1")
 	})
 	})
 }
 }
+
+func TestSetCellFloat(t *testing.T) {
+	sheet := "Sheet1"
+	t.Run("with no decimal", func(t *testing.T) {
+		f := NewFile()
+		f.SetCellFloat(sheet, "A1", 123.0, -1, 64)
+		f.SetCellFloat(sheet, "A2", 123.0, 1, 64)
+		assert.Equal(t, "123", f.GetCellValue(sheet, "A1"), "A1 should be 123")
+		assert.Equal(t, "123.0", f.GetCellValue(sheet, "A2"), "A2 should be 123.0")
+	})
+
+	t.Run("with a decimal and precision limit", func(t *testing.T) {
+		f := NewFile()
+		f.SetCellFloat(sheet, "A1", 123.42, 1, 64)
+		assert.Equal(t, "123.4", f.GetCellValue(sheet, "A1"), "A1 should be 123.4")
+	})
+
+	t.Run("with a decimal and no limit", func(t *testing.T) {
+		f := NewFile()
+		f.SetCellFloat(sheet, "A1", 123.42, -1, 64)
+		assert.Equal(t, "123.42", f.GetCellValue(sheet, "A1"), "A1 should be 123.42")
+	})
+}
+
+func ExampleFile_SetCellFloat() {
+	f := NewFile()
+	var x float64 = 3.14159265
+	f.SetCellFloat("Sheet1", "A1", x, 2, 64)
+	fmt.Println(f.GetCellValue("Sheet1", "A1"))
+	// Output: 3.14
+}