【问题标题】:Qt C++ equivalent to C# toString with custom formatQt C++ 等效于具有自定义格式的 C# toString
【发布时间】:2021-05-05 10:13:45
【问题描述】:

我正在尝试找到与 C#toString("00.00##")(或其他)自定义格式等效的 Qt/C++。 只是一些链接来解释我想要实现的目标,以防不够清楚:

https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-numeric-format-strings

Format double type with minimum number of decimal digits

对于格式:00.00##:

1.23 -> 01.23
10 -> 10.00
0.535353 -> 00.5353
831.5 -> 831.50
1.2 -> 01.20
...

我一直在尝试精确地工作,但它使精度固定。

Qt 中有没有等价的方法?我一直在寻找文档很长一段时间,但找不到任何类似的东西,以及迄今为止我最好的结果填充和精度,但问题是在使用填充时我不能同时附加结果字符串的开头和结尾(例如1.2 -> 01.20)

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    我不太确定 0.535353 -> 00.5353 是否正确,您是否希望在格式化之前截断(取整)值以设置精度或舍入到精度?

    
    double floorWithPrec(double value, int prec) {
        return floor(abs(value) * pow(10.0, prec)) / pow(10.0, prec) * (value < 0 ? -1.0 : 1.0);
    }
    
    int countIntDigits(double value, int prec) {
        double t = round(abs(value) * pow(10.0, prec)) / pow(10.0, prec);
        return t >= 1.0 ? log10(t) + 1 : 0;
    }
    
    QString toString(const QString& format, double value, bool truncate = false) {
        int fieldWidth0 = format.size();
        int intDigits0 = format.indexOf(".");
        int prec = fieldWidth0 - intDigits0 - 1;
        if (truncate) {
            value = floorWithPrec(value, prec);
        }
        int intDigits = countIntDigits(value, prec);
        int fieldWidth = qMax(intDigits0, intDigits) + 1 + prec + (value < 0 ? 1 : 0);
        QString formated = QString("%1").arg(value, fieldWidth, 'f', prec, QChar('0'));
        int trim = 0;
        while (format.size() - trim - 1 > -1
               && formated.size() - trim - 1 > -1
               && format[format.size() - trim - 1] == "#"
               && formated[formated.size() - trim - 1] == "0")  {
            trim++;
        }
        return formated.mid(0, formated.size() - trim);
    }
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QString format = "00.00##";
    
        Q_ASSERT(toString(format, 1.23) == "01.23");
        Q_ASSERT(toString(format, 10) == "10.00");
    
        Q_ASSERT(toString(format, 0.535353, true) == "00.5353");
        Q_ASSERT(toString(format, 0.535353, false) == "00.5354");
    
        Q_ASSERT(toString(format, 831.5) == "831.50");
        Q_ASSERT(toString(format, 1.2) == "01.20");
    
        Q_ASSERT(toString(format, 99.99999, false) == "100.00");
        Q_ASSERT(toString(format, 99.99999, true) == "99.9999");
    
        Q_ASSERT(toString(format, -1.23) == "-01.23");
        Q_ASSERT(toString(format, -99.99999, false) == "-100.00");
        Q_ASSERT(toString(format, -99.99999, true) == "-99.9999");
    
        Q_ASSERT(toString(format, 1e-7, true) == "00.00");
        Q_ASSERT(toString(format, 1e-7, false) == "00.00");
    
        Q_ASSERT(toString(format, -1e-7, true) == "00.00");
        Q_ASSERT(toString(format, -1e-7, false) == "-00.00");
    
        Q_ASSERT(toString(format, 0.0, true) == "00.00");
        Q_ASSERT(toString(format, 0.0, false) == "00.00");
    
        return 0;
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多