lancet
lancet copied to clipboard
formatter下的DecimalBytes非整数
DecimalBytes : 返回十进制标准(以 1000 为基数)下的可读字节单位字符串。precision 参数指定小数点后的位数,默认为 4。
根据描述precision参数为控制小数点的位数,但某些情况下会变成科学计数法 例如
// 测试6000万这个数
formatter.DecimalBytes(61812496)
// 61.812MB
formatter.DecimalBytes(61812496, 2)
// 61.8MB
formatter.DecimalBytes(61812496, 1)
// 62MB
formatter.DecimalBytes(61812496, 0)
// 6e+01MB
//再测试4亿这个数
formatter.DecimalBytes(401000000)
//401MB
formatter.DecimalBytes(4010000, 0)
//4e+02MB
最后我的解决办法,不知道合不合理 缺点就是在401.00000MB整数的时候还是会带上小数位数,不知道如何优化了。但不会出现科学计数法的表示,可以接受
func DecimalBytes(size float64, precision ...int) string {
p := 5
if len(precision) > 0 {
p = precision[0]
}
size, unit := calculateByteSize(size, 1000.0, decimalByteUnits)
position := fmt.Sprintf("%%.%df", p)
return fmt.Sprintf(position+"%s", size, unit)
}
// 测试6000万这个数
utils.DecimalBytes(61812496)
// 61.81250MB
utils.DecimalBytes(61812496, 2)
// 61.81MB
utils.DecimalBytes(61812496, 1)
// 61.8MB
utils.DecimalBytes(61812496, 0)
// 62MB
//再测试4亿这个数
utils.DecimalBytes(401000000)
//401.00000MB
utils.DecimalBytes(4010000, 0)
//4MB