diff --git a/testdata/decimal.xls b/testdata/decimal.xls new file mode 100644 index 0000000..d7c10d0 Binary files /dev/null and b/testdata/decimal.xls differ diff --git a/xls/structs.go b/xls/structs.go index c8d49a7..94dbe4b 100644 --- a/xls/structs.go +++ b/xls/structs.go @@ -27,7 +27,7 @@ type boundSheet struct { Name string } -/////// +// ///// type shRow struct { RowIndex uint16 // 0-based FirstCol uint16 // 0-based @@ -88,6 +88,12 @@ func (r RKNumber) Int() int { func (r RKNumber) Float64() float64 { val := int32(r) >> 2 + + // Value is saved as integer multiplied by 100 + if (r&1) != 0 && (r&2) != 0 { + return float64(val) / 100.0 + } + v2 := math.Float64frombits(uint64(val) << 34) if (r&1) == 0 && (r&2) == 0 { diff --git a/xls/structs_test.go b/xls/structs_test.go new file mode 100644 index 0000000..29d16e7 --- /dev/null +++ b/xls/structs_test.go @@ -0,0 +1,25 @@ +package xls + +import ( + "testing" + + "github.com/pbnjay/grate" +) + +func TestDecimalNumberSavedAsIntegerMultipliedByHundred(t *testing.T) { + wb, _ := grate.Open("../testdata/decimal.xls") + sheets, _ := wb.List() + for _, s := range sheets { + sheet, _ := wb.Get(s) + sheet.Next() + + var value float64 + sheet.Scan(&value) + + if value != 1.75 { + t.Log("Expected value to be 1.75, but actually is", value) + t.Fail() + } + } + wb.Close() +}