【问题标题】:Golang - Store / Retrieve decimal from MySQLGolang - 从 MySQL 存储/检索十进制
【发布时间】:2016-09-06 16:57:30
【问题描述】:

我正在使用 gin gonic 框架并构建了 JSON API。

我想创建一个新的端点,但其中一个值是小数。我创建了以下结构:

type AcceptedTerms struct {
    Id          int64           
    FirstName   string          
    LastName    string                    
    Fee         ***DECIMAL***
    Date        *time.Time
}

我的控制器 sn-ps 代码:

    query = "SELECT " +
            "AcceptedTerms.* " +
            "FROM AcceptedTerms " +
            "ORDER BY " + sort_by + " " + order_by +
            " LIMIT " + limit2 +
            " OFFSET " + offset2`

_, err := dbmap.Select(&response.AcceptedTerms, query)

我应该将类型设置为十进制什么?我希望用户能够发布小数,例如10.44 或 12.00 等,而不是“10.44”或“12.00”。我还希望该值按上述方式返回,而不是作为字符串返回。

更新

我尝试对我的 Struct 执行此操作,但它仍然没有显示为小数点后 2 位

type AcceptedTerms struct {
    Id          int64
    FirstName   string
    LastName    string
    Fee         Number
    Date        *time.Time
}

type Number float64

func (n Number) MarshalJSON() ([]byte, error) {
    return []byte(fmt.Sprintf("%.2f", n)), nil
}

谢谢

【问题讨论】:

    标签: mysql go


    【解决方案1】:

    float32 有什么问题吗?由于 MySQL 使用 32 位存储DECIMAL,所以float32 应该足够好了。

    【讨论】:

    • 它可以工作,但 4.10 会显示为 4.1,而 4.00 会显示为 4,这不是我想要的。
    • c.JSON(httpcode, gin.H{"meta": s, "data": response.AcceptedTerms})
    • 这是encoding/json包的默认行为。它在编组输出中将 4.00 表示为 4,将 4.10 表示为 4.1。
    • 是否有办法阻止这种情况,因为这是一种费用,所以货币,因此它应该显示为 4.00 和 4.10?
    • 显示时,客户端可以正确格式化数值。
    【解决方案2】:

    为了将 MySQL 值扫描到 Go vars,好的做法是使用 sql.Null... 类型。尤其是当列可以为空时。

    对于小数,它可以是 sql.NullFloat64:

    // ...
    var dec sql.NullFloat64
    row.Scan(&dec)
    // dec.Valid - bool
    // dec.Float64 - float64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      相关资源
      最近更新 更多