4 ответов:
QFileInfo не имеет метода, специфичного для этого, но здесь Вы можете найти простую реализацию подкласса QFileInfo и реализовать этот новый метод
QString QFileInfoHumanSize::size_human() { float num = this->size(); QStringList list; list << "KB" << "MB" << "GB" << "TB"; QStringListIterator i(list); QString unit("bytes"); while(num >= 1024.0 && i.hasNext()) { unit = i.next(); num /= 1024.0; } return QString().setNum(num,'f',2)+" "+unit; }
Qt 5.10 ввела готовое решение :
QLocale locale = this->locale(); QString valueText = locale.formattedDataSize(sizeValue);
Код, предоставленный @danielfranca, приводит к немного неверным результатам, если он используется с int, а не с плавающими числами. Вот более точная версия для представления результата в виде целого числа:
QString MyClass::convertFileSizeToHumanReadable(const qlonglong & bytes) { QString number; if(bytes < 0x400) //If less than 1 KB, report in B { number = QLocale::system().toString(bytes); number.append(" B"); return number; } else { if(bytes >= 0x400 && bytes < 0x100000) //If less than 1 MB, report in KB, unless rounded result is 1024 KB, then report in MB { qlonglong result = (bytes + (0x400 / 2)) / 0x400; if(result < 0x400) { number = QLocale::system().toString(result); number.append(" KB"); return number; } else { qlonglong result = (bytes + (0x100000 / 2)) / 0x100000; number = QLocale::system().toString(result); number.append(" MB"); return number; } } else { if(bytes >= 0x100000 && bytes < 0x40000000) //If less than 1 GB, report in MB, unless rounded result is 1024 MB, then report in GB { qlonglong result = (bytes + (0x100000 / 2)) / 0x100000; if(result < 0x100000) { number = QLocale::system().toString(result); number.append(" MB"); return number; } else { qlonglong result = (bytes + (0x40000000 / 2)) / 0x40000000; number = QLocale::system().toString(result); number.append(" GB"); return number; } } else { if(bytes >= 0x40000000 && bytes < 0x10000000000) //If less than 1 TB, report in GB, unless rounded result is 1024 GB, then report in TB { qlonglong result = (bytes + (0x40000000 / 2)) / 0x40000000; if(result < 0x40000000) { number = QLocale::system().toString(result); number.append(" GB"); return number; } else { qlonglong result = (bytes + (0x10000000000 / 2)) / 0x10000000000; number = QLocale::system().toString(result); number.append(" TB"); return number; } } else { qlonglong result = (bytes + (0x10000000000 / 2)) / 0x10000000000; //If more than 1 TB, report in TB number = QLocale::system().toString(result); number.append(" TB"); return number; } } } } }
Вот минимальный код, который может сделать то же самое.
char unit; const char *units [] = {" Bytes", " kB", " MB", " GB"}; quint64 size = 102400; // or whatever for (unit=-1; (++unit<3) && (size>1023); size/=1024); qlabel->setText (QString::number (size, 'f', 1) + units[unit]);
Comments