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的主要内容,如果未能解决你的问题,请参考以下文章