什麼是文件大小的int
轉換爲字符串的文件大小的格式,如最簡單的方法:Qt - 將int轉換爲文件大小格式(KB,MB或GB)的最簡單方法?
2048 to 2 KB
4086 KB to 4 MB
,而不是在QT5如何計算呢?
什麼是文件大小的int
轉換爲字符串的文件大小的格式,如最簡單的方法:Qt - 將int轉換爲文件大小格式(KB,MB或GB)的最簡單方法?
2048 to 2 KB
4086 KB to 4 MB
,而不是在QT5如何計算呢?
QFileInfo沒有一個具體方法爲,但here你可以找到一個簡單的實現子類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;
}
下面是一個最小的代碼,可以這樣做。
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]);
@danielfranca提供的代碼在使用int而不是float時會導致稍微不正確的結果。以下是報告的結果爲整數更精確的版本:
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;
}
}
}
}
}
的Qt 5.10先後引進ready solution:
QLocale locale = this->locale();
QString valueText = locale.formattedDataSize(sizeValue);
什麼是有關計算它的問題呢? – danielfranca
其實沒問題。只是想知道Qt是否提供了一種輕鬆實現的方法(如python中的'hurry.filesize')。 –