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: "")
}
}
Помните также, что эта реализация не учитывает локаль. Например, некоторые локали используют запятую (",") вместо точки (".") В качестве десятичного разделителя.