web-dev-qa-db-ja.com

floatをgolang html / templateでフォーマットする

フォーマットしたいfloat64 golangの小数点以下2桁の値html/templateで言うindex.htmlファイル。 .goファイル次のようにフォーマットできます。

strconv.FormatFloat(value, 'f', 2, 32)

しかし、私はそれをテンプレートでフォーマットする方法がわかりません。使ってます gin-gonic/ginバックエンドのフレームワーク。どんな助けでもありがたいです。ありがとう。

11
Bhavana

あなたには多くのオプションがあります:

  • 数値のフォーマットを決定することができます。テンプレートの実行に渡す前に fmt.Sprintf() を使用する(_n1_)
  • または、String() stringメソッドを定義する独自のタイプを作成し、好みに合わせてフォーマットすることもできます。これは、テンプレートエンジン(_n2_)によってチェックおよび使用されます。
  • テンプレートからprintfを直接かつ明示的に呼び出して、カスタム形式の文字列(_n3_)を使用することもできます。
  • printfを直接呼び出すこともできますが、これにはstringの形式を渡す必要があります。毎回これを実行したくない場合は、それだけを行うカスタム関数を登録できます(_n4_)

この例を見てください:

_type MyFloat float64

func (mf MyFloat) String() string {
    return fmt.Sprintf("%.2f", float64(mf))
}

func main() {
    t := template.Must(template.New("").Funcs(template.FuncMap{
        "MyFormat": func(f float64) string { return fmt.Sprintf("%.2f", f) },
    }).Parse(templ))
    m := map[string]interface{}{
        "n0": 3.1415,
        "n1": fmt.Sprintf("%.2f", 3.1415),
        "n2": MyFloat(3.1415),
        "n3": 3.1415,
        "n4": 3.1415,
    }
    if err := t.Execute(os.Stdout, m); err != nil {
        fmt.Println(err)
    }
}

const templ = `
Number:         n0 = {{.n0}}
Formatted:      n1 = {{.n1}}
Custom type:    n2 = {{.n2}}
Calling printf: n3 = {{printf "%.2f" .n3}}
MyFormat:       n4 = {{MyFormat .n4}}`
_

出力( Go Playground で試してください):

_Number:         n0 = 3.1415
Formatted:      n1 = 3.14
Custom type:    n2 = 3.14
Calling printf: n3 = 3.14
MyFormat:       n4 = 3.14
_
16
icza

printfテンプレート組み込み関数"%.2f" formatとともに使用します。

tmpl := template.Must(template.New("test").Parse(`The formatted value is = {{printf "%.2f" .}}`))

tmpl.Execute(os.Stdout, 123.456789)

Go Playgroung

6
dolmen

FuncMapを登録できます。

package main

import (
    "fmt"
    "os"
    "text/template"
)

type Tpl struct {
    Value float64
}

func main() {
    funcMap := template.FuncMap{
        "FormatNumber": func(value float64) string {
            return fmt.Sprintf("%.2f", value)
        },
    }

    tmpl, _ := template.New("test").Funcs(funcMap).Parse(string("The formatted value is = {{ .Value | FormatNumber  }}"))

    tmpl.Execute(os.Stdout, Tpl{Value: 123.45678})
}

遊び場

2
Nadh

編集:丸め/切り捨てについて間違っていました。

%.2fフォーマットの問題は、丸められずに切り捨てられることです。

Float、文字列解析、JSONなどを処理するお金を処理するために、int64に基づく10進数クラスを開発しました。

それはセントの64ビット整数として金額を格納します。フロートから簡単に作成したり、フロートに戻すことができます。

DBへの保存にも便利です。

https://github.com/strongo/decimal

package example

import "github.com/strongo/decimal"

func Example() {
    var amount decimal.Decimal64p2; print(amount)  // 0

    amount = decimal.NewDecimal64p2(0, 43); print(amount)  // 0.43
    amount = decimal.NewDecimal64p2(1, 43); print(amount)  // 1.43
    amount = decimal.NewDecimal64p2FromFloat64(23.100001); print(amount)  // 23.10
    amount, _ = decimal.ParseDecimal64p2("2.34"); print(amount)  // 2.34
    amount, _ = decimal.ParseDecimal64p2("-3.42"); print(amount)  // -3.42
}

私の借金追跡アプリ https://debtstracker.io/