避免科学记数法

时间:2014-12-16 19:38:02

标签: json go

我正在尝试使用Go与数据库交互并且正在运行 处理十进制字段时出现问题。

在此数据库中,大多数基本上是整数字段的字段是 输入为十进制,精度为0 ......例如:

  • 日期字段以YYYYMMDD格式存储为十进制(8,0)
  • Id号码存储为十进制(9,0)

基本上任何int都以0精度存储为小数。

我正在尝试填充结构中的字段....

type Record struct {
    ID          uint
    CHANGE_DATE uint
    ...
}

但是当我从数据库中获取字段时,他们经常会回来 这样的格式,但只有当数字足够长时:2.0141208e + 07

我发现我可以扫描到浮点数然后将浮点数转换为 像这样的uint ..

mydate := float32(0)

for rows.Next() {
    r := Record{}
    row.Scan(&.ID, &mydate)
    myrecord.Change_date = uint(mydate)
}

如果ID足够大,那么ParseInt会失败,我发现我必须这样做 如上所示进行float / int转换。

由于我有很多字段(几乎所有数字),我需要这样做, 我想知道是否有更好的方法来进行此类型转换?

值得一提的是,这是一个打包的ERP数据库 系统,所以改变表定义不是一个选项和原因 我不会让所有字段浮在Go中是因为我正在尝试输出json 我在json输出中得到了科学记数法。

1 个答案:

答案 0 :(得分:0)

从RPC服务器解析JSON时遇到了相同的问题。我创建了一个将科学记法字符串转换回unint的函数,如下所示:

func scientificNotationToUInt(scientificNotation string) (uint, error) {
    flt, _, err := big.ParseFloat(scientificNotation, 10, 0, big.ToNearestEven)
    if err != nil {
        return 0, err
    }
    fltVal := fmt.Sprintf("%.0f", flt)
    intVal, err := strconv.ParseInt(fltVal, 10, 64)
    if err != nil {
        return 0, err
    }
    return uint(intVal), nil
}

Playground example

相关问题