17

我想在文件float64中将 golang 中的值格式化为小数点后 2 位。在文件中,我可以像这样格式化:html/templateindex.html.go

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

但我不知道如何在模板中格式化它。我正在使用gin-gonic/gin后端框架。任何帮助将不胜感激。谢谢。

4

4 回答 4

31

你有很多选择:

  • 您可以决定格式化数字,例如fmt.Sprintf()在将其传递给模板执行之前使用(n1
  • 或者,您可以在定义方法的地方创建自己的类型,并String() string根据自己的喜好进行格式化。这由模板引擎 ( n2) 检查和使用。
  • 您也可以printf直接从模板中显式调用并使用自定义格式字符串 ( n3)。
  • 即使您可以printf直接调用,这也需要传递 format 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
于 2016-12-15T08:39:49.137 回答
15

printf 模板内置函数"%.2f" format

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

tmpl.Execute(os.Stdout, 123.456789)

去游乐场

于 2017-02-01T13:41:39.740 回答
4

您可以注册一个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})
}

操场

于 2016-12-15T08:47:37.943 回答
1

编辑:我错了舍入/截断。

格式化的问题%.2f在于它不会舍入而是截断。

我开发了一个基于 int64 的十进制类来处理处理浮点数、字符串解析、JSON 等的钱。

它将金额存储为 64 位整数美分。可以很容易地从浮点数创建或转换回浮点数。

也便于存储在数据库中。

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/

于 2017-04-05T09:01:13.917 回答