Формат float в golang html / шаблон

Я хочу, чтобы формат float64 значения до 2 десятичных знаков в golang html/template сказать . В .go файл я могу форматов, таких как:

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

но я не знаю, как отформатировать его в шаблоне. Я использую gin-gonic/gin рамки для бэкэнда. Любая помощь будет оценена. Спасибо.

4 ответов


у вас есть много вариантов:

  • вы можете решить отформатировать номер, например, используя fmt.Sprintf() перед передачей его в выполнение шаблона (n1)
  • или вы можете создать свой собственный тип, где вы определяете String() string способ, форматирование по своему вкусу. Это проверяется и используется шаблоном engine (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

использовать printf шаблон встроенная функция С "%.2f" format:

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

tmpl.Execute(os.Stdout, 123.456789)

Go Playgroung


Вы можете зарегистрировать 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})
}

площадка


редактировать: Я ошибся в округлении / усечении.

проблема с %.2f форматирование заключается в том, что оно не округляет, а усекает.

Я разработал десятичный класс на основе int64 для обработки денег, который обрабатывает поплавки, синтаксический анализ строк, JSON и т. д.

Он хранит сумму как 64-битное целое число центов. Может быть легко создан из float или преобразован обратно в float.

удобный для хранения в БД, а также.

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
}

хорошо работает для моих долгов tracker app https://debtstracker.io/