преобраз. вещ.число->строка фикс.длины
скажите, есть ли в Си++ функция, которая записывает вещ.число в строку длины n символов (не больше). sprintf не помогает
_fcvt - Converts a floating-point number to a string.
wchar_t *buffer,
size_t count,
const wchar_t *format [,
argument]...
); - для юникода
HRESULT StringCbPrintf( LPTSTR pszDest,
size_t cbDest,
LPCTSTR pszFormat,
...
); - под виндувс, я только их и юзаю (семейство StringCb...)
Напр:
double dMyDouble = 123.45678;
sMyString.Format("%020.13f", dMyDouble);
"000123.4567800000000"
StringCbPrintf - откуда это?
fcvt, gcvt,ecvt - не помогают, в документации по gcvt сказано, что параметр задает число цифр, а не максимальную ширину поля ввода (в которое могут входить "плюс", "минус").
Поэтому видимо в точности такого варианта в Си нет. А вот в Дельфи есть - параметр функция str задает максимальную ширину поля вывода.
Format, sprintf, swprintf - одно и тоже. И не работает. Поле width если его задать дает лишь минимальное значение вывода, если больше нужно места для записи числа, оно расширяется.
Это правильно, но в док-ции есть продолжение: параметр precision
Если ты задашь формат, покрывающий мах число, то всегда получишь одинаковое кол. символов, включая знак и тчк.
sMyString.Format("%020.13f", dMyDouble); всегда
даст 20 символов, если abs(dMyDouble)<100000
swprintf - не совсем sprintf. size_t count - максимальная длина строки. Дальше все просто обрубится, так же как и в StringCbPrintf() -виндовая ф-ция из библиотеки strsafe.lib .
Похоже в новом VS2003 добавили функции scprintf и snprintf для этой цели. Но в VC 5.0 их точно не было.
swprintf в VC 5.0 не имел параметра count
и не было StringCbPrintf.
Странно, все это ухудшает переносимость.
Это правильно, но в док-ции есть продолжение: параметр precision
Если ты задашь формат, покрывающий мах число, то всегда получишь одинаковое кол. символов, включая знак и тчк.
sMyString.Format("%020.13f", dMyDouble); всегда
даст 20 символов, если abs(dMyDouble)<100000
В том то и дело, что не знаю, на скольки символах можно разместить число типа double. По меньшей мере 22 символа.
Странно, все это ухудшает переносимость.
Я бы употребил термин совместимость. Но с этим все ОК. Написанное для VS 5(6) как правило работает и под .NET ( с поправкой на ошибки версии и мелкие разночтения стандарта ), но, естественно, не наоборот.
В том то и дело, что не знаю, на скольки символах можно разместить число типа double. По меньшей мере 22 символа.
Трудно представить такие величины. Ты что измеряешь кол-во атомов в мировом океане? IMHO дело не в абстрактном double, а в диапазоне твоих величин и разумной точности их отбражения
Я бы употребил термин совместимость. Но с этим все ОК. Написанное для VS 5(6) как правило работает и под .NET ( с поправкой на ошибки версии и мелкие разночтения стандарта ), но, естественно, не наоборот.
Есть еще UNIX-системы. В них использ. такие же функции.
В том то и дело, что не знаю, на скольки символах можно разместить число типа double. По меньшей мере 22 символа.
1(знак) + 1(целая часть) + 1(е) + 1(знак мантиссы) + 17(мантисса) = 21
1(знак) + 1(целая часть) + 1(е) + 1(знак мантиссы) + 17(мантисса) = 21
Но кроме формы записи с экспонентой может присутствовать обычная запись вещ. числа. Под мантиссу (степень 10) отводится 3 символа+знак мантиссы.
Кроме того, нужно учесть, что есть символ ".".
1(знак) + 1(целая часть) + 1(е) + 1(знак мантиссы) + 17(мантисса) = 21
Вернее будет так:
1(знак) + 1(точка) + 17(мантисса) + 1(е) + 1(знак степени) + 3 (показатель степени) = 24 - при научной записи числа
Вернее будет так:
1(знак) + 1(точка) + 17(мантисса) + 1(е) + 1(знак степени) + 3 (показатель степени) = 24 - при научной записи числа
Точно не уверен, но мантисса должна быть меньше. 10 или 16.
И перед точкой идет число - при научной записи числа всегда 1.
Точно не уверен, но мантисса должна быть меньше. 10 или 16.
И перед точкой идет число - при научной записи числа всегда 1.
Согласен - забыл число, но не всегда 1.
3.243423e-21
Согласен - забыл число, но не всегда 1.
3.243423e-21
хорошо, в итоге имеем 25.
Хотя лучше действительно уйти от жесткого задания длины цифр в программе.
Microsoft меньше всего заботься о совместимости своих платформам, сред разработки и исполнения с чужими. И мало интересуется переносимостью программ.
Но ведь есть ANSI стандарт.