いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-489 (通貨型を扱いたい)(bojanz/currency)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。

ちょっとしたことなんですが、Goで通貨型を扱いたいときがあったので

情報さがしてみた所、以下のライブラリを発見。

github.com

シンプルで使いやすいライブラリでした。以下、軽くつかってみたサンプル。

サンプル

main.go

package main

import (
    "context"
    "errors"
    "fmt"
    "log"
    "time"

    "github.com/bojanz/currency"
)

func init() {
    log.SetFlags(log.Lmicroseconds)
}

func main() {
    var (
        rootCtx          = context.Background()
        mainCtx, mainCxl = context.WithTimeoutCause(rootCtx, time.Second, errors.New("too slow"))
        procCtx          = run(mainCtx)
        err              error
    )
    defer mainCxl()

    select {
    case <-mainCtx.Done():
        err = context.Cause(mainCtx)
    case <-procCtx.Done():
        if err = context.Cause(procCtx); errors.Is(err, context.Canceled) {
            err = nil
        }
    }

    if err != nil {
        log.Fatal(err)
    }
}

func run(ctx context.Context) context.Context {
    ctx, cxl := context.WithCancelCause(ctx)

    go func() {
        cxl(proc(ctx))
    }()

    return ctx
}

func proc(_ context.Context) error {
    type data struct {
        v string
        c string
        l string
    }

    items := []data{
        {"129", "JPY", "ja"},
        {"129", "USD", "en"},
        {"129", "EUR", "fr"},
    }
    for _, item := range items {
        var (
            amount    currency.Amount
            locale    currency.Locale
            formatter *currency.Formatter
            err       error
        )
        locale = currency.NewLocale(item.l)
        formatter = currency.NewFormatter(locale)

        amount, err = currency.NewAmount(item.v, item.c)
        if err != nil {
            return err
        }

        fmt.Println(formatter.Format(amount))
    }

    return nil
}

実行すると以下のように出力されます。

Taskfile.yml

# https://taskfile.dev

version: '3'

tasks:
  default:
    cmds:
      - task: run
  run:
    cmds:
      - go run main.go

shell

$ task
task: [run] go run main.go
¥129
$129.00
129,00

try-golang-extlib/examples/singleapp/currency at main · devlights/try-golang-extlib · GitHub

参考情報

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。