web-dev-qa-db-ja.com

floatを小数点以下n桁にフォーマットし、末尾にゼロを付けない

末尾のゼロを使用せずに、整数部分全体と小数部分の小数点以下2桁までの浮動小数点数を表示したいと思います。

http://play.golang.org/p/mAdQl6erWX

// Desired output: 
// "1.9"
// "10.9"
// "100.9"

fmt.Println("2g:")
fmt.Println(fmt.Sprintf("%.2g", 1.900)) // outputs "1.9"
fmt.Println(fmt.Sprintf("%.2g", 10.900)) // outputs "11"
fmt.Println(fmt.Sprintf("%.2g", 100.900)) // outputs "1e+02"

fmt.Println("\n2f:")
fmt.Println(fmt.Sprintf("%.2f", 1.900)) // outputs "1.90"
fmt.Println(fmt.Sprintf("%.2f", 10.900)) // outputs "10.90"
fmt.Println(fmt.Sprintf("%.2f", 100.900)) // outputs "100.90"

2gを使用してフォーマットすると、整数が桁違いに増加すると丸めが開始されるという問題があります。また、eで数字が表示されることもあります。

2fでフォーマットすると、末尾のゼロが表示されるという問題があります。末尾のゼロを削除する後処理関数を作成することもできますが、これはSprintfを使用して行います。

これは、Sprintfを使用して一般的な方法で実行できますか?
そうでない場合、これを行うための良い方法は何ですか?

13
Blaise

strconv.FormatFloat(10.900, 'f', -1, 64)

これにより、10.9

-1 3番目のパラメーターは、フロートを正確に表すために必要な最小桁数を出力するように関数に指示します。

ここを参照してください: https://golang.org/pkg/strconv/#FormatFloat

27
Eric E.

Sprintfについてはわかりませんが、機能させるためです。最初に右にトリミングしてください0そして.

fmt.Println(strings.TrimRight(strings.TrimRight(fmt.Sprintf("%.2f", 100.900), "0"), ".")) // 100.9
fmt.Println(strings.TrimRight(strings.TrimRight(fmt.Sprintf("%.2f", 100.0), "0"), ".")) // 100
4
ferhat elmas

私は同じことを達成するために以下の関数を使用しました:

//return 45.00 with "45" or 45.50 with "45.5"
func betterFormat(num float32) string {
    s := fmt.Sprintf("%.4f", num)
    return strings.TrimRight(strings.TrimRight(s, "0"), ".")
}
1
Hamid Karimi