【 Go】boilerのtypes.decimal型使い方まとめ
背景
プロダクトでdecimal型を使っていたが、他に情報がなくて苦戦していたので、まとめました。
decimal型とは?
概要はこちらの記事を参照してください。
decimalにはdecimal.decimal
型とtypes.decimal
型の2種類がある。一般的には前者の情報であれば、色々情報が出てきますが、後者の情報はあまり出てきません。後者はgoでboiler独自の型になっています。boilerの説明は下記の記事にあります。
types.Decimal型の使い方
数字の扱い方
decimal型では通常の数字(intなど)を扱うことができない。そこでdecimal型に数字を入れるときgithub.com/ericlagergren/decimal
とgithub.com/volatiletech/sqlboiler/v4/types
の二つのライブラリが必要になります。
decimalFloat := types.NewDecimal(decimal.New(22, 1)) //decimal.New(1234, 3) 1.234
decimalInt := types.NewDecimal(decimal.New(22, 1)) //decimal.New(2, 0) 2.0
decimalNull := types.NewNullDecimal(nil) // null
types.NewDecimal()
はtypes.decimlal
型を作成する関数です。その中に入れる引数の型がdecimal.dig
型というものがあります。これは上記のようにdecimal.New()
に値を入れることで作成できます。
types.Decimal型をjson変換する時に文字列になる時の対処法
decimal型ではjson形式に変換すると文字列に合ってしまうことがある。これの対処法は一旦decimal型をstring型に直して、その後にfloat型にする。そうすることでjsonの中でも数値として扱うことができます。ちなみにtypes.Nulldecimal型では数値でそのまま扱うことができます。
decimalFloat := types.NewDecimal(decimal.New(22, 1))
float, err := strconv.ParseFloat(decimalFloat.String(), 64)
if err != nil {
fmt.Printf("%s\n", err.Error())
}
decimal型でnilの時にエラー文を返す時の対処法
types.decimalは値がnullになるとpanicの文字列を返します。普通ならpanicが出た時点で処理が終了するのですが、types.decimal型はエラーの文字列を返します。この対処法としてnullだった時に0を返す処理を実装しました。
var a types.NullDecimal
switch a.IsZero() { //decimal型がnullかどうかを判別する関数
case true:
a = types.NewNullDecimal(decimal.New(0, 0))
default:
a = v.ProductElementValue.NumberValue
}
最後に
内容自体は難しくないのですが、情報がネットにほとんど出てこなかったので、少し手こずりました、、、今回の記事を見て参考になれば幸いです。
Discussion