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