| ... | ... |
@@ -6,6 +6,7 @@ import ( |
| 6 | 6 |
"flag" |
| 7 | 7 |
"fmt" |
| 8 | 8 |
"io" |
| 9 |
+ "math" |
|
| 9 | 10 |
"os" |
| 10 | 11 |
"path/filepath" |
| 11 | 12 |
"strconv" |
| ... | ... |
@@ -43,6 +44,35 @@ var ( |
| 43 | 44 |
tmpStr string |
| 44 | 45 |
) |
| 45 | 46 |
|
| 47 |
+// ParseFloat ist an advanced ParseFloat for golang, support scientific notation, comma separated number |
|
| 48 |
+// from yyscamper at https://gist.github.com/yyscamper/5657c360fadd6701580f3c0bcca9f63a |
|
| 49 |
+func ParseFloat(str string) (float64, error) {
|
|
| 50 |
+ val, err := strconv.ParseFloat(str, 64) |
|
| 51 |
+ if err == nil {
|
|
| 52 |
+ return val, nil |
|
| 53 |
+ } |
|
| 54 |
+ //Some number may be seperated by comma, for example, 23,120,123, so remove the comma firstly |
|
| 55 |
+ str = strings.Replace(str, ",", "", -1) |
|
| 56 |
+ //Some number is specifed in scientific notation |
|
| 57 |
+ pos := strings.IndexAny(str, "eE") |
|
| 58 |
+ if pos < 0 {
|
|
| 59 |
+ return strconv.ParseFloat(str, 64) |
|
| 60 |
+ } |
|
| 61 |
+ var baseVal float64 |
|
| 62 |
+ var expVal int64 |
|
| 63 |
+ baseStr := str[0:pos] |
|
| 64 |
+ baseVal, err = strconv.ParseFloat(baseStr, 64) |
|
| 65 |
+ if err != nil {
|
|
| 66 |
+ return 0, err |
|
| 67 |
+ } |
|
| 68 |
+ expStr := str[(pos + 1):] |
|
| 69 |
+ expVal, err = strconv.ParseInt(expStr, 10, 64) |
|
| 70 |
+ if err != nil {
|
|
| 71 |
+ return 0, err |
|
| 72 |
+ } |
|
| 73 |
+ return baseVal * math.Pow10(int(expVal)), nil |
|
| 74 |
+} |
|
| 75 |
+ |
|
| 46 | 76 |
// parseCommaGroup parses a single comma group (x or x-y), |
| 47 | 77 |
// optionally followed by :datatype (used only for columns right now) |
| 48 | 78 |
// It returns a map with row or column index as key and the datatype as value |
| ... | ... |
@@ -307,7 +337,7 @@ func writeCellContents(cell *xlsx.Cell, colString, colType string, rownum, colnu |
| 307 | 337 |
case "text": |
| 308 | 338 |
cell.SetString(colString) |
| 309 | 339 |
case "number", "currency": |
| 310 |
- floatVal, err := strconv.ParseFloat(colString, 64) |
|
| 340 |
+ floatVal, err := ParseFloat(colString) |
|
| 311 | 341 |
if err != nil {
|
| 312 | 342 |
fmt.Println(fmt.Sprintf("Cell (%d,%d) is not a valid number, value: %s", rownum, colnum, colString))
|
| 313 | 343 |
success = false |