Go语言 如何用逗号和2个小数位格式化货币?

3xiyfsfu  于 2023-05-04  发布在  Go
关注(0)|答案(3)|浏览(259)

我正试图格式化一些数字作为货币,与逗号和2个小数位。我找到了“github.com/dustin/go-humanize“作为逗号,但它不允许指定小数位数。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
nwwlzxa7

nwwlzxa71#

这就是humanize.FormatFloat()的作用:

// FormatFloat produces a formatted number as string based on the following user-specified criteria:
// * thousands separator
// * decimal separator
// * decimal precision

在您的案例中:

FormatFloat("#,###.##", afloat)

话虽如此,正如LenW所评论的那样,floatin Go, float64)并不适合货币。
参见floating-point-gui.de
使用像go-inf/inf(以前的go/dec,例如在这个货币实现中使用)这样的包会更好。
参见12月去:

// 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类型包含Format()方法。
自2015年7月以来,您现在有来自Kyoung-chan Lee ( leekchan )的**leekchan/accounting**,具有相同的建议:
请不要使用float64来数钱。当您对浮点型执行操作时,它们可能会出现错误。
强烈建议使用big.Rat(〈Go 1.5)或big.Float(〉= Go 1.5)。(记帐支持float64,但这只是为了方便。)

fmt.Println(ac.FormatMoneyBigFloat(big.NewFloat(123456789.213123))) // "$123,456,789.21"
7gcisfzg

7gcisfzg2#

有一篇很好的博客文章关于为什么你永远不应该在这里使用浮点数来表示货币-http://engineering.shopspring.com/2015/03/03/decimal/
从他们的例子中,你可以:

d := New(-12345, -3)
  println(d.String())

将为您带来:

-12.345
yruzcnhs

yruzcnhs3#

fmt.Printf("%.2f", 12.3456)

输出为12.34

相关问题