ByteCountFormatter iOS Swift

Преобразовать значения байтов в ГБ / МБ / КБ, я использую ByteCountFormatter. Пример кода ниже.

func converByteToGB(_ bytes:Int64) -> String {
        let formatter:ByteCountFormatter = ByteCountFormatter()
        formatter.countStyle = .binary

        return formatter.string(fromByteCount: Int64(bytes))
    }

Теперь мое требование - показывать только одну цифру после десятичной точки. Пример для 1,24 ГБ => 1,2 ГБ, а не 1,24 ГБ. Принудительно ввести одну цифру после применения функции пола или потолка.

1 ответ

ByteCountFormatter не способен показывать только одну цифру после десятичной точки. По умолчанию отображаются цифры 0 для байтов и килобайт; 1 дробная цифра для МБ; 2 для ГБ и выше. Если isAdaptive установлен в false он пытается показать не менее трех значащих цифр, вводя дробные цифры по мере необходимости.

ByteCountFormatter также обрезает конечные нули. Чтобы отключить набор zeroPadsFractionDigits в true,

Я адаптировал Как преобразовать размер байта в удобочитаемый формат в 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)
}

Обратите внимание, что формат КБ и МБ будет отличаться от ByteCountFormatter, Вот модификация, которая удаляет завершающий ноль и не показывает цифры дроби для КБ и для чисел больше 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: "")
    }
}

Помните также, что эта реализация не учитывает локаль. Например, некоторые локали используют запятую (",") вместо точки (".") В качестве десятичного разделителя.

Другие вопросы по тегам