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
, а затем нормализовать формат с помощью некоторого жирного искажения регулярных выражений. Не совсем приятное решение, но вы делаете то, что должны.