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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Форматирование числа (number_format) 
V
    Опции темы
volatile
Дата 2.8.2011, 01:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



suxxor, я благодаря вам baldina, и borisbn, сохранил в свою личную библотеку тоже такую функцию.
Если, конечно не последуют претесты от вышеназванных кодеров по лицензионным соглашениям smile 

Если интересует заключительный вариант, то вот он.
Переносимый, универсальный на любой целочисленный тип (включая отрицательные числа).
Вывод тоже универсальный: как в юникод, так и в обычную строку.
Возвращает длину выведенной строки.
Код

template < typename TINT, typename  TCHR >
size_t currency_format  ( TINT val, TCHR * out, TCHR delimiter = TCHR(',') )
{
   bool sign = val < 0;
   size_t i = 0;
   do
   {
     if ((i+1)%4 == 0)
        out[i++] = delimiter;
      int mod = val % 10;
      if ( sign ) mod = -mod;
      out[i++] = mod + TCHR('0');
   } while (val /= 10);
   if ( sign ) out[i++] = TCHR('-');
   out[i] = 0;
   std::reverse ( out, out + i );
   return i;
}

тестирование здесь:
http://liveworkspace.org/code/19f5212fafcc...0f437555a875e98

зы: если какие замечания по коду, велкам.

PM MAIL   Вверх
borisbn
Дата 2.8.2011, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



volatile, а чего б сразу не взять модуль
Код

if ( sign )
    val = -val;

и избавиться в цикле от
Цитата
if ( sign ) mod = -mod;

?

P.S. Лицензия MIT smile


Это сообщение отредактировал(а) borisbn - 2.8.2011, 08:25


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 2.8.2011, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Цитата(suxxor @ 2.8.2011,  00:39)
bsa, проблем  начальством нет - потому что начальства нет... Учу по книге STL для профессионалов от Николая Джусьютиса, всё никак ниасилю

А для кого писалось это?
PM   Вверх
spyswamp
Дата 2.8.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

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



Код - жесть. Уязвим и опасен, я бы сказал, как минимум. Ботай яростно STL, ибо это никогда ревью не пройдет. smile


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
volatile
Дата 2.8.2011, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(borisbn @  2.8.2011,  06:50 Найти цитируемый пост)
volatile, а чего б сразу не взять модуль
код C++
if ( sign )
    val = -val;

Я думал над этим. Тут есть одна маленькая зоковыка. 
Если число является самым маленьким отрицательным, то этот фокус не проходит.
например:
signed char c = -128;
c = -c;
здесь  с не станет +128 smile



Цитата(spyswamp @  2.8.2011,  11:24 Найти цитируемый пост)
Код - жесть. Уязвим и опасен

не опасней обычных itoa(); sprintf(); и т.д.
но универсален, в отличии от последних.

PM MAIL   Вверх
spyswamp
Дата 2.8.2011, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

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



volatile, именно поэтому означенные вами функции не рекомендованы к использованию и являются deprecated.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
volatile
Дата 2.8.2011, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



spyswamp, я прекрасно этими функциями пользуюсь, и никогда у меня лично с ними проблем не было.
этот код я писал не для ревью, а для личных нужд.
И меня в плане "безопасности" он вполне устраивает.

Напишите пример безопасной, но такой-же эффективной, удобной, и универсальной функции, я буду только рад.
 smile 
Ваши ссылки на применение потоковых функций с применением locale я просмотрел.
Считаю что это ни универсально, ни удобно, ни эффективно. Имхо.

ЗЫ: Я вообще не очень люблю потоковый вывод (сейчас адепты строгого С++ забросают помидорами).

Это сообщение отредактировал(а) volatile - 2.8.2011, 13:32
PM MAIL   Вверх
borisbn
Дата 2.8.2011, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(volatile @  2.8.2011,  12:00 Найти цитируемый пост)
Я думал над этим. Тут есть одна маленькая зоковыка. 


borisbn : volatile 0 : 1
где тут смайлик с посыпанием головы пеплом ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
spyswamp
Дата 2.8.2011, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

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



Цитата

я прекрасно этими функциями пользуюсь, и никогда у меня лично с ними проблем не было


Цитата

Ваши ссылки на применение потоковых функций с применением locale я просмотрел.
Считаю что это ни универсально, ни удобно, ни эффективно. Имхо.

ЗЫ: Я вообще не очень люблю потоковый вывод (сейчас адепты строгого С++ забросают помидорами).


Ваша функция не эффективна, не удобна, не универсальна. Ее завалить можно в 1 прием извне. RTFM.

А по STL я скажу проще: если используете C++, то и пишите на C++ с использованием соответствующего функционала. До вас уже сотни людей все изучили до подноготной, обернули, написали и соптимизировали. Не надо тут заливать всем в уши ваш бред про любовь и нелюбовь.

Дальнейшую дискуссию с вами продолжать не вижу смысла. У вас даже "имхо" неумное оказалось.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
borisbn
Дата 2.8.2011, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(spyswamp @  2.8.2011,  13:15 Найти цитируемый пост)
именно поэтому означенные вами функции не рекомендованы к использованию и являются deprecated.

Кем ? M$-ом ? Если бы мы их слушали, то мы (программисты) каждый год меняли бы технологии (COM, ActiveX, MTS, .Net, Silverlight, etc. - всех не упомнишь).


Цитата(volatile @  2.8.2011,  13:31 Найти цитируемый пост)
Считаю что это ни универсально, ни удобно, ни эффективно

Цитата(volatile @  2.8.2011,  13:31 Найти цитируемый пост)
Я вообще не очень люблю потоковый вывод

поддерживаю. 

spyswamp, запиши это
Код

sprintf( str, "%03d°%02d'%02d\"", grad, min, sec );

в Си++ с потоками


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
spyswamp
Дата 2.8.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

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



borisbn, по printf() и ее безопасности читани интернеты, а потом уже поддерживай.

По второму вопросу: ты реально думаешь, что я не смогу на потоках это сделать? smile

Добавлено через 9 минут и 40 секунд
Это если ты скажешь "да":

Код

std::ostringstream ss;
ss.fill('0'); 
ss << std::setw(3) << grad << "°" << std::setw(2) << min << "'" << std::setw(2) << sec << "\"" << std::endl;
std::string test = ss.str();


Debug: http://dl.dropbox.com/u/943861/projects/tr...f-vs-stream.png

А вообще для таких вещей уже давно есть boost::format().


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
baldina
Дата 2.8.2011, 14:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



spyswamp, есть у меня знакомый электрик, некоторые вещи иногда он делает не по правилам, не отключая напряжение. это не значит, что напряжение безопасно. но это не значит что он неосторожен: как раз он достаточно осторожен, что бы иногда (когда это эффективнее) работать так.
а потоки в STL не верх совершенства. хотя бы потому, что непросто создать универсальный интерфейс. было б не так, не появились бы подпорки boost::lexical_cast и boost::format.

volatile, borisbn, а вот форматирование чисел с разделителями в STL делается таки довольно изящно и удобно.

вобщем хорошш спорить  smile 
PM MAIL   Вверх
volatile
Дата 2.8.2011, 15:19 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(borisbn @  2.8.2011,  14:19 Найти цитируемый пост)
запиши это
sprintf( str, "%03d°%02d'%02d\"", grad, min, sec );


Цитата(spyswamp @ 2.8.2011,  14:41)
Код

std::ostringstream ss;
ss.fill('0'); 
ss << std::setw(3) << grad << "°" << std::setw(2) << min << "'" << std::setw(2) << sec << "\"" << std::endl;
std::string test = ss.str();


Да, изящно!  smile 
PM MAIL   Вверх
spyswamp
Дата 2.8.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

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



volatile, не вырывай из контекста. borisbn попросил - я написал. И будьте внимательнее, товарищ велосипедист: "А вообще для таких вещей уже давно есть boost::format()."


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
borisbn
Дата 2.8.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(spyswamp @  2.8.2011,  14:41 Найти цитируемый пост)
по printf() и ее безопасности читани интернеты, а потом уже поддерживай

не говори мне, что мне делать, а я не скажу (дальше - в интернетах)

Цитата(spyswamp @  2.8.2011,  14:41 Найти цитируемый пост)
ты реально думаешь, что я не смогу на потоках это сделать?

я, наверное, неправильно выразился. я не имел в виду, что этого сделать нельзя. я и сам могу это сделать. я как раз "поддерживал" то, что это будет
Цитата(volatile @  2.8.2011,  13:31 Найти цитируемый пост)
ни универсально, ни удобно, ни эффективно

как, собственно и вышло.

Цитата(spyswamp @  2.8.2011,  15:33 Найти цитируемый пост)
И будьте внимательнее, товарищ велосипедист: "А вообще для таких вещей уже давно есть boost::format()."

1. Попридержи язык с оскорблениями
2. У меня, в отличие от тебя, есть необходимость собирать проект на многих компьютерах, а не на одном своём рабочем. Ради простого проекта по тому же самому переводу широты/долготы в строку я буст подключать (а главное такскать его за собой) не собираюсь

Это сообщение отредактировал(а) borisbn - 2.8.2011, 16:25


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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