如何使用逗号和2位小数格式化货币?

时间:2015-07-19 17:09:37

标签: go

我正在尝试将某些数字格式化为货币,使用逗号和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

4 个答案:

答案 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 LenWfloatin 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。