Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> sprintf: форматированный вывод денег:), 9,999,999.99 
:(
    Опции темы
Rilken
Дата 25.5.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.3.2007
Где: Днепропетровск

Репутация: нет
Всего: нет



Товарищи, как с помощью Sprintf получить такое  9,999,999.99 , еще и выровненное по правому краю...
Похожие темки все прочитаны, а ответ не найден:) Спасибо
PM ICQ Skype   Вверх
Alexeis
Дата 25.5.2009, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Код

  char tmp[500];
  float f = 43.56;
  sprintf(tmp, "%.2d,%.3d,%.3d\.%.2d", int(f) / 1000, int(f) / 1000000, int(f) % 1000000, int((f - int(f)) * 100));


Цитата(Rilken @  25.5.2009,  17:14 Найти цитируемый пост)
еще и выровненное по правому краю...

По правому краю чего? Прямоугольника? Тогда это DrawText


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rilken
Дата 25.5.2009, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.3.2007
Где: Днепропетровск

Репутация: нет
Всего: нет



Цитата(Alexeis @ 25.5.2009,  18:37)
Код

  char tmp[500];
  float f = 43.56;
  sprintf(tmp, "%.2d,%.3d,%.3d\.%.2d", int(f) / 1000, int(f) / 1000000, int(f) % 1000000, int((f - int(f)) * 100));



Цитата(Rilken @  25.5.2009,  17:14 Найти цитируемый пост)
еще и выровненное по правому краю...

По правому краю чего? Прямоугольника? Тогда это DrawText



Хм, выводится 9999,009,999999.99 вместо требуемого 9,999,999.99 smile
По правому краю экрана) Но вроде эта команда по дефолту справа выводит
PM ICQ Skype   Вверх
Alexeis
Дата 25.5.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



А вот так? 
Код

 char tmp[500];
  float f = 43.56;
  sprintf(tmp, "%.1d,%.3d,%.3d\.%.2d", int(f) / 1000000, (int(f) % 1000000) / 1000, int(f) % 1000, int((f - int(f)) * 100));

P.S. нет компилятора под рукой не могу проверить.

Добавлено через 1 минуту и 15 секунд
Цитата(Rilken @  25.5.2009,  17:56 Найти цитируемый пост)
По правому краю экрана) Но вроде эта команда по дефолту справа выводит 

  Она выводит так как ей указать. Умеет и справа и слева и по центру и обрезать умеет и сокращать, чего только не умеет.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
jonie
Дата 25.5.2009, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



http://msdn.microsoft.com/en-us/library/cyc6by18.aspx
и в STL что-то было, но там как-то все было сложно с региональными настройками и локалью.. поройте по форуму, обсуждалось.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Rilken
Дата 25.5.2009, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.3.2007
Где: Днепропетровск

Репутация: нет
Всего: нет



Цитата(Alexeis @ 25.5.2009,  20:26)
А вот так? 
Код

 char tmp[500];
  float f = 43.56;
  sprintf(tmp, "%.1d,%.3d,%.3d\.%.2d", int(f) / 1000000, (int(f) % 1000000) / 1000, int(f) % 1000, int((f - int(f)) * 100));

P.S. нет компилятора под рукой не могу проверить.


Не заморачивайтесь, я идею понялаsmile Я-то сделала, но решение довольно некрасивое, хотелось бы чего-то более изящного smile

Добавлено через 1 минуту и 19 секунд
Цитата(jonie @ 25.5.2009,  20:55)
http://msdn.microsoft.com/en-us/library/cyc6by18.aspx
и в STL что-то было, но там как-то все было сложно с региональными настройками и локалью.. поройте по форуму, обсуждалось.

Спасибо за подсказку,  даже не подумала про стл. Буду смотреть в эту сторонуsmile
PM ICQ Skype   Вверх
Alexeis
Дата 26.5.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  Если вы работаете в билдере, то там есть специальное решение. Во первых тип Currency, а во вторых функция Format, которая умеет форматировать "деньги"


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rilken
Дата 26.5.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.3.2007
Где: Днепропетровск

Репутация: нет
Всего: нет



Цитата(Alexeis @ 26.5.2009,  09:24)
Если вы работаете в билдере, то там есть специальное решение. Во первых тип Currency, а во вторых функция Format, которая умеет форматировать "деньги"

Не, у меня тут  AIX, поэтому не катит:(
PM ICQ Skype   Вверх
Rilken
Дата 26.5.2009, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.3.2007
Где: Днепропетровск

Репутация: нет
Всего: нет



Цитата(Alexeis @ 25.5.2009,  20:26)
А вот так? 
Код

 char tmp[500];
  float f = 43.56;
  sprintf(tmp, "%.1d,%.3d,%.3d\.%.2d", int(f) / 1000000, (int(f) % 1000000) / 1000, int(f) % 1000, int((f - int(f)) * 100));



Кстати, а как заставить ф-цию не выводить нулевые значения первых двух параметров?
Ведь если у нас будет число 2.9, то получим 0,  0,  2.9 ?
PM ICQ Skype   Вверх
Alexeis
Дата 26.5.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Rilken @  26.5.2009,  09:34 Найти цитируемый пост)
Ведь если у нас будет число 2.9, то получим 0,  0,  2.9 ? 

странно, должно быть так 0,000,002.9 ... у меня именно так и выходит.

Что сказать, функция sprintf не предназначена для работы с деньгами, тут нужно искать что-то специализированное.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
math64
Дата 26.5.2009, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Код

void format_money(double money, char* buffer) {
  if (money < 0) {
    money = -money; *buffer++ = '-';
  }
  if (money >= 1E9) {
     sprintf(buffer, "%d,%03d,%03d,%03d.%02d", 
       (int)(money/1E9),
       (int)(money/1E6)%1000,
       (int)(money/1E3)%1000,
       (int)money%1000,
       (int)(money*100)%100);
  } else if (money >= 1E6) {
     sprintf(buffer, "%d,%03d,%03d.%02d", 
       (int)(money/1E6),
       (int)(money/1E3)%1000,
       (int)money%1000,
       (int)(money*100)%100);
  } else if (money >= 1E3) {
     sprintf(buffer, "%d,%03d.%02d", 
       (int)(money/1E3),
       (int)money%1000,
       (int)(money*100)%100);
  } else {
     sprintf(buffer, "%d.%02d", 
       (int)money,
       (int)(money*100)%100);
  }
}



PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.