Как отформатировать показатель числа с плавающей запятой в printf% E (научный) - PullRequest
1 голос
/ 24 июля 2011

Когда я использую

sprintf('%E',@value)

для большого произвольного значения,

например. 3.14158995322368e+22f

печатает

3,14158995322368e + 0 22 * ​​1015 *

Как мне отформатировать экспоненту? Например. нет начальных 0 (2 цифры) или всегда 3 или 4 цифры (1 или 2 ведущих нуля).

1 Ответ

1 голос
/ 28 июля 2011

Ruby's sprintf - это просто оболочка для нативной библиотеки libc snprintf. От sprintf.c (Ruby 1.9.2-p180):

/*   
 *  call-seq:
 *     format(format_string [, arguments...] )   -> string
 *     sprintf(format_string [, arguments...] )  -> string 
 * [...]
 */

VALUE
rb_f_sprintf(int argc, const VALUE *argv)
{
    return rb_str_format(argc - 1, argv + 1, GETNTHARG(0));
}

А внутри rb_str_format мы находим это:

case 'f':
case 'g':
case 'G':
case 'e':
case 'E':
case 'a':
case 'A':
    /* ... */
    snprintf(&buf[blen], need, fbuf, fval);

Таким образом, вы должны получать одинаковые результаты на одной платформе, но не обязательно одинаковые результаты на разных платформах (даже после учета обычных проблем с плавающей запятой). Ruby sprintf не предлагает никакого способа управления определенным форматированием экспоненты, поэтому вы находитесь в зависимости от libc ОС (т. Е. Вам повезло, libc не помилует).

При необходимости вы можете использовать sprintf, а затем нормализовать формат с помощью некоторого жирного искажения регулярных выражений. Не совсем приятное решение, но вы делаете то, что должны.

...