Qt-самый простой способ конвертировать int в формат размера файла (КБ, Мб или ГБ)?



Какой самый простой способ конвертировать int размер файла в строку в формате размера файла, например:



2048 to 2 KB
4086 KB to 4 MB


Вместо того, чтобы вычислять его вручную в Qt5?

469   4  
qt

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

    Ничего не найдено.