将浮点数格式化为 n 个小数位并且没有尾随零
Format a float to n decimal places and no trailing zeros
我想显示一个浮点数,其中包含整个整数部分和小数部分最多两位小数,不带尾随零。
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
格式化会出现尾随零的问题。我可以编写一个 post 处理函数来删除尾随零,但我宁愿使用 Sprintf
.
可以使用 Sprintf
以通用方式完成吗?
如果没有,有什么好的方法吗?
不确定 Sprintf
但要让它发挥作用。刚刚 trim 对,先 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
strconv.FormatFloat(10.900, 'f', -1, 64)
这将导致 10.9
。
作为第三个参数的 -1
告诉函数打印准确表示浮点数所需的最少数字。
我使用下面的函数来实现相同的目的:
//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"), ".")
}
使用下面的函数来格式化和控制位数。
func FormatFloat(num float64, prc int) string {
var (
zero, dot = "0", "."
str = fmt.Sprintf("%."+strconv.Itoa(prc)+"f", num)
)
return strings.TrimRight(strings.TrimRight(str, zero), dot)
}
这是一个例子:
// Converts 18.24100100 to 18.24
fmt.Println(FormatFloat(18.24100100, 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
格式化会出现尾随零的问题。我可以编写一个 post 处理函数来删除尾随零,但我宁愿使用 Sprintf
.
可以使用 Sprintf
以通用方式完成吗?
如果没有,有什么好的方法吗?
不确定 Sprintf
但要让它发挥作用。刚刚 trim 对,先 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
strconv.FormatFloat(10.900, 'f', -1, 64)
这将导致 10.9
。
作为第三个参数的 -1
告诉函数打印准确表示浮点数所需的最少数字。
我使用下面的函数来实现相同的目的:
//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"), ".")
}
使用下面的函数来格式化和控制位数。
func FormatFloat(num float64, prc int) string {
var (
zero, dot = "0", "."
str = fmt.Sprintf("%."+strconv.Itoa(prc)+"f", num)
)
return strings.TrimRight(strings.TrimRight(str, zero), dot)
}
这是一个例子:
// Converts 18.24100100 to 18.24
fmt.Println(FormatFloat(18.24100100, 2))