我正在使用ByteCountFormatter将Bytes值转换为GB/MB/KB。下面的示例代码。
func converByteToGB(_ bytes:Int64) -> String {
let formatter:ByteCountFormatter = ByteCountFormatter()
formatter.countStyle = .binary
return formatter.string(fromByteCount: Int64(bytes))
}
现在,我的要求是它应仅在小数点后显示一位数字。
1.24 GB的示例=> 1.2 GB,而不是1.24 GB。应用落地或天花板功能后,将其强制为一位数。
最佳答案
ByteCountFormatter
不能仅显示小数点后一位。默认情况下,它显示字节和KB的0个小数位; MB的1个小数位; 2 GB和更高版本。如果将isAdaptive
设置为false
,它将尝试显示至少三个有效数字,并根据需要引入小数位数。ByteCountFormatter
还修剪尾随零。要禁用,请将zeroPadsFractionDigits
设置为true
。
我已将How to convert byte size into human readable format in java?修改为您要执行的操作:
func humanReadableByteCount(bytes: Int) -> String {
if (bytes < 1000) { return "\(bytes) B" }
let exp = Int(log2(Double(bytes)) / log2(1000.0))
let unit = ["KB", "MB", "GB", "TB", "PB", "EB"][exp - 1]
let number = Double(bytes) / pow(1000, Double(exp))
return String(format: "%.1f %@", number, unit)
}
请注意,这将格式化KB和MB而不是
ByteCountFormatter
。这是一个删除尾随零并且不显示KB和大于100的数字的小数位数的修改。func humanReadableByteCount(bytes: Int) -> String {
if (bytes < 1000) { return "\(bytes) B" }
let exp = Int(log2(Double(bytes)) / log2(1000.0))
let unit = ["KB", "MB", "GB", "TB", "PB", "EB"][exp - 1]
let number = Double(bytes) / pow(1000, Double(exp))
if exp <= 1 || number >= 100 {
return String(format: "%.0f %@", number, unit)
} else {
return String(format: "%.1f %@", number, unit)
.replacingOccurrences(of: ".0", with: "")
}
}
另请注意,此实现未考虑语言环境。例如,某些语言环境使用逗号(“,”)代替点(“。”)作为小数点分隔符。