2016-12-15 16 views
8

Tôi muốn định dạng float64 giá trị thành 2 chữ số thập phân trong golang html/template ghi trong tệp index.html. Trong .go tệp tôi có thể định dạng như:Định dạng float trong golang html/template

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

Nhưng tôi không biết cách định dạng nó trong mẫu. Tôi đang sử dụng khung công tác gin-gonic/gin cho chương trình phụ trợ. Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn.

Trả lời

12

Bạn có nhiều lựa chọn:

  • Bạn có thể quyết định để định dạng số ví dụ sử dụng fmt.Sprintf() trước khi chuyển nó đến việc thực hiện mẫu (n1)
  • Hoặc bạn có thể tạo loại của riêng mình, nơi bạn xác định phương thức String() string, định dạng theo ý thích của mình. Điều này được kiểm tra và sử dụng bởi công cụ mẫu (n2).
  • Bạn cũng có thể gọi printf trực tiếp và rõ ràng từ mẫu và sử dụng chuỗi định dạng tùy chỉnh (n3).
  • Mặc dù bạn có thể gọi trực tiếp printf, yêu cầu này phải chuyển định dạng string. Nếu bạn không muốn làm điều này mỗi lần, bạn có thể đăng ký một chức năng tùy chỉnh thực hiện điều đó (n4)

Xem ví dụ này:

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 (thử nó trên 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

Thanks for the help. Nhưng làm thế nào tôi có thể định dạng trong bản thân mẫu? Có cách nào để định dạng không?Hoặc tôi cũng phải chuyển kiểu tùy chỉnh cho mẫu với các dữ liệu khác? Hãy giúp tôi. – Bhavana

+0

@ user29 Xem trường hợp 'n4': một số" tinh khiết "của kiểu' float64' được chuyển ('3.1415'), và nó được định dạng trong tempalte:' {{printf "% .2f" .n4}} ' . – icza

+0

Được rồi .. Cảm ơn rất nhiều .. – Bhavana

2

Bạn có thể đăng ký 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}) 
} 

Playground

+0

Đã có sẵn chức năng tích hợp sẵn 'printf'. Xem câu trả lời của riêng tôi. – dolmen

-1

Vấn đề với %.2f định dạng là nó không tròn nhưng sẽ cắt cụt.

tôi đã phát triển một lớp thập phân dựa trên Int64 để xử lý số tiền đó là xử lý nổi, chuỗi phân tích cú pháp, JSON vv

Nó lưu trữ lượng như số nguyên 64 bit của cent. Có thể dễ dàng tạo ra từ phao hoặc chuyển đổi trở lại phao.

Tiện dụng để lưu trữ trong 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 
} 

trình tốt cho ứng dụng nợ theo dõi của tôi https://debtstracker.io/

Các vấn đề liên quan