我正在使用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: "")
    }
}

另请注意,此实现未考虑语言环境。例如,某些语言环境使用逗号(“,”)代替点(“。”)作为小数点分隔符。

10-08 05:45