🤖

【 Go】boilerのtypes.decimal型使い方まとめ

2022/08/18に公開

背景

プロダクトでdecimal型を使っていたが、他に情報がなくて苦戦していたので、まとめました。

decimal型とは?

概要はこちらの記事を参照してください。
https://zenn.dev/tmk616/articles/a0b516bb18cfbd

decimalにはdecimal.decimal型とtypes.decimal型の2種類がある。一般的には前者の情報であれば、色々情報が出てきますが、後者の情報はあまり出てきません。後者はgoでboiler独自の型になっています。boilerの説明は下記の記事にあります。
https://zenn.dev/tmk616/articles/7dedb17ede8d27

types.Decimal型の使い方

数字の扱い方

decimal型では通常の数字(intなど)を扱うことができない。そこでdecimal型に数字を入れるときgithub.com/ericlagergren/decimalgithub.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