2016-12-15 6 views
8

I float64 Wert auf 2 Dezimalstellen in golang html/template sagt in index.html Datei formatiert werden soll. Ich kann in .go Dateiformat wie:Format Schwimmer in golang html/template

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

Aber ich weiß nicht, wie es in Vorlage zu formatieren. Ich benutze gin-gonic/gin Framework für Backend. Jede Hilfe wird geschätzt. Vielen Dank.

Antwort

12

Sie haben viele Möglichkeiten:

  • Sie können beschließen, die Zahl formatiert werden z.B. Verwenden Sie fmt.Sprintf() vor der Übergabe an die Vorlagenausführung (n1)
  • Oder Sie können Ihren eigenen Typ erstellen, wo Sie die String() string Methode, formatieren nach Ihren Wünschen. Dies wird von der Vorlagen-Engine überprüft und verwendet (n2).
  • Sie können auch printf direkt und explizit aus der Vorlage aufrufen und benutzerdefinierte Formatzeichenfolge (n3) verwenden. Wenn Sie printf direkt aufrufen können, muss das Format string übergeben werden. Wenn Sie dies jedes Mal tun wollen nicht, können Sie eine benutzerdefinierte Funktion zu tun registrieren nur, dass (n4)

dieses Beispiel Siehe:

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}}` 

Output (versuchen Sie es auf dem Go Playground):

Number:   n0 = 3.1415 
Formatted:  n1 = 3.14 
Custom type: n2 = 3.14 
Calling printf: n3 = 3.14 
MyFormat:  n4 = 3.14 
+0

Danke für die Hilfe. Aber wie kann ich in der Vorlage selbst formatieren? Gibt es eine Möglichkeit zu formatieren?Oder muss ich auch benutzerdefinierten Typ an die Vorlage mit anderen Daten übergeben? Bitte helfen Sie. – Bhavana

+0

@ user29 Siehe den 'n4' Fall: eine" reine "Zahl vom Typ' float64' wird übergeben ('3.1415'), und es wird in der tempalte formatiert:' {{printf "% .2f" .n4}} ' . – icza

+0

Okay .. Vielen Dank .. – Bhavana

2

Sie können eine FuncMap registrieren.

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}) 
} 

Playground

+0

Es gibt bereits eine 'printf'-Funktion. Siehe meine eigene Antwort. – dolmen

2

Verwenden Sie die printftemplate built-in function mit dem "%.2f" format:

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

tmpl.Execute(os.Stdout, 123.456789) 

Go Playgroung

-1

Das Problem mit %.2f Formatierung ist, dass es nicht rund, sondern Verkürzungen der Fall ist.

Ich habe eine Dezimalzahl Klasse basierend auf int64 entwickelt Geld für die Handhabung, den Schwimmer, String-Parsing, JSON etc.

Es speichert Menge als 64-Bit-Integer-Zahl von Cent verarbeitet. Kann einfach aus Float erstellt oder zurück in Float konvertiert werden.

Praktisch für die Speicherung im 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 
} 

funktioniert gut für meine Schulden Tracker App https://debtstracker.io/