Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как округлять в QString?
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
kuler
хочу чтобы не было лишних нулей, то бишь не 123.000 а 123, но 123.21
QString str = QString::number(123.0, 'f', -1);
    double d = 12.34;
    str = QString("%1").arg(d, 1, 'f', 5);
SABROG
Цитата(kuler @ 12.2.2009, 18:26) *
а 123, но 123.21

Это как?
AD
Хммм... хороший вопросец! :)


Цитата(SABROG @ 12.2.2009, 18:33) *
Это как?

Т.е. если число 123, то отображалось 123, а не 123.000, а если число - 123.21, то и отображалось число 123.21.


Если по теме: сомневаюсь, что такое возможно сделать. Довольно сложно себе представить разбор. Да даже если и можно представить, то придется самому делать! :(
Litkevich Yuriy
kuler, а какой тип является исходным? double?
kwisp
в лоб
str.remove(QRexExp(".0+$"));
kuler
Цитата(Litkevich Yuriy @ 12.2.2009, 18:44) *
а какой тип является исходным? double?

да
Цитата(kwisp @ 12.2.2009, 18:47) *
в лоб
str.remove(QRexExp(".0+$"));

а такое сработает? 12.23 а не 12.230000
kwisp
kuler,
ща рег ехп напишу покорректнее
kuler
а может sprintf?
Litkevich Yuriy
код:
int main(int argc, char** argv)
{
  QApplication app(argc, argv);
  double    d1 = 12;
  double    d2 = 12.10;
  double    d3 = 12.100;
  double    d4 = 0.100;
  
    
    qDebug() << "d1 =" << d1;
    qDebug() << "d2 =" << d2;
    qDebug() << "d3 =" << d3;
    qDebug() << "d4 =" << d4;
    
    return 0;
}

вывод в консоль:
d1 = 12
d2 = 12.1
d3 = 12.1
d4 = 0.1
kuler
Litkevich Yuriy, а чтобы 12.123456 было 12.12? то бишь установить прецизион. Можно конечно прогнать через number а потом qDebug, но некрасиво, да и вообще qDebug чото мне не нравится, он в релизе то будет работать?
Litkevich Yuriy
Цитата(kuler @ 12.2.2009, 22:07) *
qDebug чото мне не нравится, он в релизе то будет работать?
я это не для окончательного варианта привел, а как повод глянуть в его исходник - готовое решение. Но раз уж тебе другое надо, то и делать надо по другому.
kwisp
kuler,
ну вот так сработает если прецижион больше одного

str.remove(QRegExp("0+$|\\.0+$"));

кстати для чего тебе ??? а то я смотрю ты в лог выводишь строку эту?
kuler
Цитата(kwisp @ 12.2.2009, 19:11) *
а то я смотрю ты в лог выводишь строку эту?

это не я вывожу. Нужно для того что это нормально.
SABROG
Сразу хочу сказать, что метод не безопасен, т.к. double может быть больше чем int.

Округляем до тысячных (3 знака) по правилу математики
    double da = 123.0;
    double db = 123.123;
    double dc = 123.0001;
    da = int(da*1000+0.005)/1000.;
    db = int(db*1000+0.005)/1000.;
    dc = int(dc*1000+0.005)/1000.;
    qDebug() << QString("%1 %2 %3").arg(da).arg(db).arg(dc);


"123 123.123 123"
kuler
Цитата(Litkevich Yuriy @ 12.2.2009, 19:11) *
а как повод глянуть в его исходник - готовое решение.

просмотр привел к следующему коду, вроде работает
QString str;
    QTextStream stream(&str);
    stream.setRealNumberPrecision(4);

    stream << 4.5;
kwisp
kuler,
только что проверил этот код не совсем корректно работает. тут реалпрецижион это не колличество знаков после запятой а колличество знаков вообще:)

надо со стандартными потоками поработать:) там вроде можно сделать.
SABROG
В C++ в принципе нет метода trunc (хотя он и есть в MSVC) для обрезания экспоненты. http://en.wikipedia.org/wiki/Truncate

В стандартных потоках есть такое http://www.cplusplus.com/reference/iostrea...tprecision.html
kwisp
так решение в примере написано :)
бери и пользуй.
kuler
Цитата(kwisp @ 13.2.2009, 14:14) *
так решение в примере написано

каком?
kwisp
Цитата(SABROG @ 13.2.2009, 13:06) *
В стандартных потоках есть такое http://www.cplusplus.com/reference/iostrea...tprecision.html
kuler
kwisp, ну пардон, там же нули не убираются, кроме того мне нужно лить куда нить в строку.

так а в Си++ то вообще как прцижн указывать окромя sprintf?
kwisp
kuler,
посему второй вывод в примере убирает лишние нули.
строчки можно через поток прогнать если тебе не по душе вариант с QString::remove(QRegExp&).

Раскрывающийся текст

// setprecision example
#include <iostream>
#include <iomanip>
using namespace std;

int main () {
double f =3.14159;
cout << setprecision (5) << f << endl;
cout << setprecision (9) << f << endl;
cout << fixed;
cout << setprecision (5) << f << endl;
cout << setprecision (9) << f << endl;
return 0;
}


Раскрывающийся текст

3.1416
3.14159
3.14159
3.141590000
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.