Je veux formater la valeur float64
à 2 décimales dans golang html/template
dire dans le fichier index.html
. Dans le fichier .go
, je peux formater comme ceci:
strconv.FormatFloat(value, 'f', 2, 32)
Mais je ne sais pas comment le formater dans un modèle. J'utilise le framework gin-gonic/gin
pour le backend. Toute aide serait appréciée. Merci.
Vous avez plusieurs options:
fmt.Sprintf()
avant de le transmettre à l'exécution du modèle (n1
)String() string
, en le formatant à votre guise. Ceci est vérifié et utilisé par le moteur de template (n2
).printf
directement et explicitement à partir du modèle et utiliser une chaîne de format personnalisée (n3
).printf
, cela nécessite de passer au format string
. Si vous ne voulez pas le faire à chaque fois, vous pouvez enregistrer une fonction personnalisée faisant exactement cela (n4
)Voir cet exemple:
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}}`
Sortie (essayez-le sur Go Playground ):
Number: n0 = 3.1415
Formatted: n1 = 3.14
Custom type: n2 = 3.14
Calling printf: n3 = 3.14
MyFormat: n4 = 3.14
Utilisez la fonction printf
template intégrée avec le "%.2f" format
:
tmpl := template.Must(template.New("test").Parse(`The formatted value is = {{printf "%.2f" .}}`))
tmpl.Execute(os.Stdout, 123.456789)
Vous pouvez enregistrer une 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})
}
Edit: je me suis trompé en arrondissant/tronquant.
Le problème avec le formatage %.2f
est qu’il ne arrondit pas mais tronque.
J'ai développé une classe décimale basée sur int64 pour gérer l'argent, qui traite les flottants, l'analyse des chaînes, JSON, etc.
Il stocke le montant sous la forme d'un nombre entier de 64 bits. Peut être facilement créé à partir de float ou reconverti en float.
Pratique pour stocker dans DB également.
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
}
Fonctionne bien pour mon application de suivi des dettes https://debtstracker.io/