Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > sprintf: форматированный вывод денег:)


Автор: Rilken 25.5.2009, 18:14
Товарищи, как с помощью Sprintf получить такое  9,999,999.99 , еще и выровненное по правому краю...
Похожие темки все прочитаны, а ответ не найден:) Спасибо

Автор: 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

Автор: Rilken 25.5.2009, 18:56
Цитата(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
По правому краю экрана) Но вроде эта команда по дефолту справа выводит

Автор: 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. нет компилятора под рукой не могу проверить.

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

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

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

Автор: Rilken 25.5.2009, 23:05
Цитата(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

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

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

Не, у меня тут  AIX, поэтому не катит:(

Автор: Rilken 26.5.2009, 10:34
Цитата(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 ?

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

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

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

Автор: math64 26.5.2009, 12:47
Код

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);
  }
}



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)