我正在尝试将某些数字格式化为货币,使用逗号和2位小数。我找到了" github.com/dustin/go-humanize"对于逗号,但它不允许指定小数位数。 fmt.Sprintf将执行货币和小数格式,但不会使用逗号。
for _, fl := range []float64{123456.789, 123456.0, 123456.0100} {
log.Println(humanize.Commaf(fl))
}
结果:
123,456.789
123,456
123,456.01
我期待:
$123,456.79
$123,456.00
$123,456.01
答案 0 :(得分:8)
这就是humanize.FormatFloat()的作用:
// FormatFloat produces a formatted number as string based on the following user-specified criteria:
// * thousands separator
// * decimal separator
// * decimal precision
在你的情况下:
FormatFloat("$#,###.##", afloat)
话虽如此,commented LenW,float
(in Go, float64
)并不适合货币。
请参阅floating-point-gui.de。
使用像go-inf/inf
这样的软件包(之前的go / dec,例如在this currency implementation中使用)更好。
请参阅Dec.go:
// A Dec represents a signed arbitrary-precision decimal.
// It is a combination of a sign, an arbitrary-precision integer coefficient
// value, and a signed fixed-precision exponent value.
// The sign and the coefficient value are handled together as a signed value
// and referred to as the unscaled value.
该类型Dec
包含a Format()
method。
自2015年7月起,您现在leekchan/accounting
的{strong> Kyoung-chan Lee (leekchan
) 提出了相同的建议:
请不要使用
float64
来计算金钱。浮动在对它们执行操作时可能会出错 强烈建议使用big.Rat
(< Go 1.5)或big.Float
(> = Go 1.5)。 (会计支持float64
,但这只是为了方便。)
fmt.Println(ac.FormatMoneyBigFloat(big.NewFloat(123456789.213123))) // "$123,456,789.21"
答案 1 :(得分:3)
有一篇很好的博客文章说明为什么你不应该使用花车代表货币 - http://engineering.shopspring.com/2015/03/03/decimal/
从他们的例子中你可以:
d := New(-12345, -3)
println(d.String())
会给你:
-12.345
答案 2 :(得分:1)
fmt.Printf("%.2f", 12.3456)
- 输出为12.34
答案 3 :(得分:-4)
尝试:
ToString("#,##0.00");
或者你也可以试试这个:
int number = 1234567890;
Convert.ToDecimal(number).ToString("#,##0.00");
您将得到如此结果1,234,567,890.00。