Qt C++ 等效于具有自定义格式的 C# toString

Posted

技术标签:

【中文标题】Qt C++ 等效于具有自定义格式的 C# toString【英文标题】:Qt C++ equivalent to C# toString with custom format 【发布时间】: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)

【问题讨论】:

【参考方案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;


【讨论】:

以上是关于Qt C++ 等效于具有自定义格式的 C# toString的主要内容,如果未能解决你的问题,请参考以下文章

自 c# 以来的 c++ 代码等效? [关闭]

C++ typedef struct 等效于 C#

C# RSA 等效于 C++ Crypto API 的代码

C# 等效于 C++ map<string,double>

Qt 的 moc/C++11 是不是与 C# 的 nameof() 运算符等效?

C++ ULONG 定义为 VB.NET 还是 C# 等效?