marshalling decimal.Decimal in golang

huangapple go评论83阅读模式
英文:

marshalling decimal.Decimal in golang

问题

我正在使用github.com/shopspring/decimal进行货币操作(带有精度的数字)

最佳方法是如何将decimal.Decimal进行编组和解组,并获得相同的值?

有没有一种将decimal.Decimal转换为字符串的方法?

谢谢。

英文:

I am using github.com/shopspring/decimal for money operations (Numbers with precision)

What is the best way to marshalling a decimal.Decimal and unmarshallin and get the same value ?

Is a way to convert decimal.Decimal to string ?

Thank.

答案1

得分: 2

decimal.Decimal 实现了 json.Marshaler 接口和 json.Unmarshaler 接口。json.Marshal() 调用它的 MarshalJSON 方法来生成 JSON;而 json.Unmarshal() 调用它的 UnmarshalJSON 方法来解析 JSON 编码的数据。因此,你不需要显式地进行这些操作。

英文:

decimal.Decimal implements the json.Marshaler interface and the json.Unmarshaler interface. json.Marshal() calls its MarshalJSON method to produce JSON; while json.Unmarshal() calls its UnmarshalJSON method to parse the JSON-encoded data. So, you do not need to do it explicitly.

答案2

得分: 2

decimal.Decimal 实现了 Stringer 接口。

因此,要将 decimal.Decimal 转换为字符串,其中 ddecimal.Decimal

s := d.String()

要从字符串中获取 decimal.Decimal,请使用 decimal.NewFromString()

d, err := decimal.NewFromString(s)
if err != nil {
    // 处理错误
}

还要注意,默认情况下,decimal.Decimal 将作为一个字符串(即双引号表示)进行 JSON 编组。解组时自动支持带引号(字符串)或不带引号(数字)的值。

如果需要,可以通过将 decimal.MarshalJSONWithoutQuotes 设置为 true 来控制编组行为,例如与需要在 JSON 载荷中使用数字值的 API 进行交互。

这里有两个需要注意的事项:

1)此设置会影响所有 decimal.Decimal 值的编组。似乎没有办法有选择地按情况设置带引号或不带引号的编组。

2)不带引号的编组可能导致精度的悄悄丢失。

不需要“控制”解组行为。根据需要,decimal.Decimal 将从正确编码的字符串或数字值解组。

从解组到数字时,不会丢失精度(除非在原始编组为该数字值时发生了任何丢失)。

英文:

decimal.Decimal implements the Stringer interface.

Therefore, to convert to a string, where d is a decimal.Decimal:

s := d.String()

To obtain a decimal.Decimal from a string, use decimal.NewFromString():

d, err := decimal.NewFromString(s)
if err != nil {
    // handle err
}

Note also that decimal.Decimal will marshal to JSON as a string by default (that is, a double-quoted representation). Unmarshalling automatically supports quoted (string) or non-quoted (number) values.

The marshalling behaviour can be controlled by setting decimal.MarshalJSONWithoutQuotes to true if desired. e.g. if interacting with an API that requires/expects a number value in a JSON payload.

There are two things to be aware of here:

  1. this setting affects the marshalling of all decimal.Decimal values. There appears to be no way to marshal with/without quotes on a case-by-case basis selectively

  2. marshalling without quotes may result in a silent loss of precision

There is no need to "control" the unmarshalling behaviour. a decimal.Decimal will be unmarshalled from either a (correctly encoded) string or number value, as needed.

There is no loss of precision resulting from unmarshalling a number (aside from any loss occurring as a result of the original marshalling to that number value).

huangapple
  • 本文由 发表于 2023年4月10日 06:17:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/75973156.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定