crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> форматирование double в строку
a_goodgirl
  опции профиля:
сообщение 5.8.2009, 18:13
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 4.6.2009
Пользователь №: 801

Спасибо сказали: 0 раз(а)




Репутация:   0  


привет.
Нужно преобразовать число с плавающей точкой в строку, используя формат. Что-то вроде FormatFloat.
Формат типа "0,00" или "### #0,00" - основная задача - число знаков после запятой, количество разрядов и разделители разрядов.
Пыталась использовать маску QLineEdit таким образом:
QLineEdit edt;
edt.setInputMask("0,00");
QString s;
s.setNum(12345.678, 'f', 2);
edt.setText(s);
text = edt.text();

но в text возвращается 12.3, а мне нужно 12345.67.
Т.е. чтобы представить корректно число из примера, нужно что-то вроед маски "####0.00" - или я чего-то не понимаю..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 5.8.2009, 18:45
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Может проще будет отказаться от маски в пользу QDoubleValidator?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
a_goodgirl
  опции профиля:
сообщение 5.8.2009, 19:33
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 4.6.2009
Пользователь №: 801

Спасибо сказали: 0 раз(а)




Репутация:   0  


спасибо.. Не поможет валидатор..
не по адресу, видимо, обратилась на форум qt. Просто думала, может у них есть.
на самом деле нужен аналог фукнции FormatFloat (реализована на Паскале, Delphi, в C++ Builder )
преобразование числа в строку с помощью форматирования (аналогично Excel)
Неохота изобретать велосипед. Пытаюсь найти исходники ф-ции, что ли..
Понятно, что форматирование сложное, не sprintf( buf, "%.2f", f);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 5.8.2009, 19:37
Сообщение #4


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Читай в ассистенте про QString::arg или Qstring::number, все там есть.

Сообщение отредактировал panter_dsd - 5.8.2009, 19:38
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
a_goodgirl
  опции профиля:
сообщение 5.8.2009, 20:12
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 35
Регистрация: 4.6.2009
Пользователь №: 801

Спасибо сказали: 0 раз(а)




Репутация:   0  


в смысле
QString QString::arg ( double a, int fieldWidth = 0, char format = 'g', int precision = -1, const QChar & fillChar = QLatin1Char( ' ' ) ) const

?
Форматирование в FormatFloat такого рода:

формат примеры
-----------------------------------------------------
0000.00 1=0001.00
99=0099.00
100.001=0100.00
12345=12345.00


####.## 1=0001.0
99=0099.0
100.001=0100.001
12345=12345.0
разделитель разрядов
# ##0,000 123160.2=123 160.200

как все слиплось
сейчас еще раз в виде картинки:
(еще нужны разделители разрядов, формат типа # ##0,000, результат 12345.2 = 12 345.200)

===================================
Насколько я поняла, в QString("%1").arg можно дополнить заданным символом (например, '0') до заданной ширины
но задача ставится - дополнить в зависимости от маски
т.е. если 0 в шаблоне - дополнять, # - не дополнять
Причина редактирования: используй тэг code

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 5.8.2009, 20:36
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


А где-то на формуе была подобная тема. И средствами Qt, вроде, неполучилось реализовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 5.8.2009, 20:46
Сообщение #7


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Отнаследуйся и сделай как надо. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 5.8.2009, 22:11
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Ты же сама ограничила свою маску:

edt.setInputMask("0,00");


Вот "тупой" QLineEdit и берет тупо первые 3 символа из текста. Расширь так:

edt.setInputMask("0000000,00000000");


Обрезать экспоненту тоже можно, но метод не безопасен, т.к. 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"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 12.12.2024, 9:53