当我使用
时 sprintf('%E',@value)
对于某些大的任意值,
e.g。 3.14158995322368e+22f
打印
3.14158995322368e + 0 22
如何格式化指数?例如。没有前导0(2位)或总是3或4位(1或2个前导零)。
答案 0 :(得分:1)
Ruby的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
,然后使用一些油腻的正则表达式修改来规范化格式。不完全是一个令人愉快的解决方案,但你做了你必须做的事情。