如何在Qt中显示具有固定位数的浮点数?

如何在Qt中显示具有固定位数的浮点数?,qt,Qt,我想在Qt中显示一个固定位数(4)的浮点数,但不使用零填充未使用的位数(相当于最大位数)。换句话说,这就是我想为以下示例演示的内容: 0->0.0 10->10.0 980.5->980.5 1200.5->1.200 k 9900.9->9.900 k 120500.9->120.5 k 999888.88->999.9 k 等等。。我尝试了QString::number()和QString::args()的许多组合,但都没有成功。那我该怎么做呢 注意:我知道对于大于1000的数字,我必须

我想在Qt中显示一个固定位数(4)的浮点数,但不使用零填充未使用的位数(相当于最大位数)。换句话说,这就是我想为以下示例演示的内容:

  • 0->0.0
  • 10->10.0
  • 980.5->980.5
  • 1200.5->1.200 k
  • 9900.9->9.900 k
  • 120500.9->120.5 k
  • 999888.88->999.9 k
等等。。我尝试了
QString::number()
QString::args()
的许多组合,但都没有成功。那我该怎么做呢

注意:我知道对于大于1000的数字,我必须应用除法并手动添加标签“k”-我已经在这样做了

编辑: 下面的代码正是我想要的,只是它与所有那些
if-else
非常不合适。我想知道如何使用Qt的函数实现这一点:

float temp = getSomeValue();
const char* itemUnities[] = { "V", "W", "A", "J" };

if (temp < 10.0f)
{
    painter.drawText(defaultX + 60,yPosition,QString::number(temp,'f',3));
    painter.drawText(defaultX + 110,yPosition,tr(itemUnities[aaa]));
}
else if (temp < 100.0f)
{
    painter.drawText(defaultX + 60,yPosition,QString::number(temp,'f',2));
    painter.drawText(defaultX + 110,yPosition,tr(itemUnities[aaa]));
}
else if (temp < 1000.0f)
{
    painter.drawText(defaultX + 60,yPosition,QString::number(temp,'f',1));
    painter.drawText(defaultX + 110,yPosition,tr(itemUnities[aaa]));
}
else if (temp < 10000.0f)
{
    temp *= 0.001;

    painter.drawText(defaultX + 60,yPosition,QString::number(temp,'f',3));
    painter.drawText(defaultX + 110,yPosition,tr("k") + tr(itemUnities[aaa]));
}
else if (temp < 100000.0f)
{
    temp *= 0.001;

    painter.drawText(defaultX + 60,yPosition,QString::number(temp,'f',2));
    painter.drawText(defaultX + 110,yPosition,tr("k") + tr(itemUnities[aaa]));
}
else if (temp < 1000000.0f)
{
    temp *= 0.001;

    painter.drawText(defaultX + 60,yPosition,QString::number(temp,'f',1));
    painter.drawText(defaultX + 110,yPosition,tr("k") + tr(itemUnities[aaa]));
}
else if (temp < 10000000.0f)
{
    temp *= 0.000001;

    painter.drawText(defaultX + 60,yPosition,QString::number(temp,'f',3));
    painter.drawText(defaultX + 110,yPosition,tr("M") + tr(itemUnities[aaa]));
}
else if (temp < 100000000.0f)
{
    temp *= 0.000001;

    painter.drawText(defaultX + 60,yPosition,QString::number(temp,'f',2));
    painter.drawText(defaultX + 110,yPosition,tr("M") + tr(itemUnities[aaa]));
}
else if (temp < 1000000000.0f)
{
    temp *= 0.000001;

    painter.drawText(defaultX + 60,yPosition,QString::number(temp,'f',1));
    painter.drawText(defaultX + 110,yPosition,tr("M") + tr(itemUnities[aaa]));
}
float temp=getSomeValue();
常量字符*项单元[]={“V”、“W”、“A”、“J”};
如果(温度<10.0f)
{
painter.drawText(默认X+60,Y位置,Q字符串::编号(临时,'f',3));
painter.drawText(默认X+110,Y位置,tr(条目[aaa]);
}
否则,如果(温度<100.0f)
{
painter.drawText(默认X+60,Y位置,Q字符串::编号(临时,'f',2));
painter.drawText(默认X+110,Y位置,tr(条目[aaa]);
}
否则,如果(温度<1000.0f)
{
painter.drawText(默认X+60,Y位置,Q字符串::编号(临时,'f',1));
painter.drawText(默认X+110,Y位置,tr(条目[aaa]);
}
否则,如果(温度<10000.0f)
{
温度*=0.001;
painter.drawText(默认X+60,Y位置,Q字符串::编号(临时,'f',3));
绘图文本(默认X+110,Y位置,tr(“k”)+tr(条目[aaa]);
}
否则,如果(温度<100000.0f)
{
温度*=0.001;
painter.drawText(默认X+60,Y位置,Q字符串::编号(临时,'f',2));
绘图文本(默认X+110,Y位置,tr(“k”)+tr(条目[aaa]);
}
否则如果(温度<1000000.0f)
{
温度*=0.001;
painter.drawText(默认X+60,Y位置,Q字符串::编号(临时,'f',1));
绘图文本(默认X+110,Y位置,tr(“k”)+tr(条目[aaa]);
}
否则如果(温度<10000000.0f)
{
温度*=0.000001;
painter.drawText(默认X+60,Y位置,Q字符串::编号(临时,'f',3));
绘图文本(默认X+110,Y位置,tr(“M”)+tr(条目[aaa]);
}
否则如果(温度<100000000.0f)
{
温度*=0.000001;
painter.drawText(默认X+60,Y位置,Q字符串::编号(临时,'f',2));
绘图文本(默认X+110,Y位置,tr(“M”)+tr(条目[aaa]);
}
否则如果(温度<100000000.0f)
{
温度*=0.000001;
painter.drawText(默认X+60,Y位置,Q字符串::编号(临时,'f',1));
绘图文本(默认X+110,Y位置,tr(“M”)+tr(条目[aaa]);
}

由于您对转换有非常具体的要求,因此内置方法并不能提供所有功能,但通过一些技巧,您可以使用
QString::number()
QString::truncate()

QString doubleToQStr(常数双值,常数大小d)
{
QString str=QString::number(val,'g',15);
如果(val>=std::pow(10.0,静态_-cast(d-1)))
{ 
截断str.truncate(d);
//找到震级
尺寸=0;
而(val>=std::pow(10.0,static_cast(mag)){mag++}
如果(磁感应>3)
{
大小\u t dotpos=mag%3;
str.insert(dotpos,“.”);
大小\u t mag3=mag-dotpos;
开关(mag3)
{ 
案例3:
str+=“k”;中断;
案例6:
str+=“M”;中断;
案例9:
str+=“G”;断裂;
案例12:
str+=“T”;断裂;
违约:
str+=“?”中断;
}
}
}
否则如果(val
以下是我使用的测试用例:

int main(int argc, char *argv[])
{
  QApplication a(argc, argv);

  std::cout << "99919999.9 -> " << doubleToQStr(99919999.9, 4).toStdString() << std::endl;
  std::cout << "9999.9 -> " << doubleToQStr(9999.9, 4).toStdString() << std::endl;
  std::cout << "999.9 -> " << doubleToQStr(999.9, 4).toStdString() << std::endl;
  std::cout << "99.9 -> " << doubleToQStr(99.9, 4).toStdString() << std::endl;
  std::cout << "9.9 -> " << doubleToQStr(9.9, 4).toStdString() << std::endl;
  std::cout << "0.9 -> " << doubleToQStr(0.9, 4).toStdString() << std::endl;
  std::cout << "0.09 -> " << doubleToQStr(0.09, 4).toStdString() << std::endl;
  std::cout << "0.009 -> " << doubleToQStr(0.009, 4).toStdString() << std::endl;
  std::cout << "0.0009 -> " << doubleToQStr(0.0009, 4).toStdString() << std::endl;
  std::cout << "0.00009 -> " << doubleToQStr(0.00009, 4).toStdString() << std::endl;

    return a.exec();
}
intmain(intargc,char*argv[])
{
质量保证申请a(argc、argv);

std::cout你在哪里被阻止了?@UmNyobe抱歉,但我不明白你的问题:p你已经做了很多事情,但你没有说哪些用例失败了。我想你应该如何将数字转换成浮点数字并打印出来。你如何制作
0
print
0.0
?你被困在哪里了?@UmNyobe我不明白nd为什么我要写失败的代码?毕竟我想要的是适用于我介绍的场景的代码\o/无论如何,我编辑了我的问题,以不太优雅的方式发布了一个完全符合我要求的代码;我希望这会有所帮助。考虑到实际的格式(没有QPainter业务)您的函数已经简单多了。然后添加一个单元测试来彻底测试它。
int main(int argc, char *argv[])
{
  QApplication a(argc, argv);

  std::cout << "99919999.9 -> " << doubleToQStr(99919999.9, 4).toStdString() << std::endl;
  std::cout << "9999.9 -> " << doubleToQStr(9999.9, 4).toStdString() << std::endl;
  std::cout << "999.9 -> " << doubleToQStr(999.9, 4).toStdString() << std::endl;
  std::cout << "99.9 -> " << doubleToQStr(99.9, 4).toStdString() << std::endl;
  std::cout << "9.9 -> " << doubleToQStr(9.9, 4).toStdString() << std::endl;
  std::cout << "0.9 -> " << doubleToQStr(0.9, 4).toStdString() << std::endl;
  std::cout << "0.09 -> " << doubleToQStr(0.09, 4).toStdString() << std::endl;
  std::cout << "0.009 -> " << doubleToQStr(0.009, 4).toStdString() << std::endl;
  std::cout << "0.0009 -> " << doubleToQStr(0.0009, 4).toStdString() << std::endl;
  std::cout << "0.00009 -> " << doubleToQStr(0.00009, 4).toStdString() << std::endl;

    return a.exec();
}