如何格式化printf%E(科学)中浮点数的指数

时间:2011-07-23 21:01:00

标签: ruby formatting printf

当我使用

sprintf('%E',@value)

对于某些大的任意值,

e.g。 3.14158995322368e+22f

打印

3.14158995322368e + 0 22

如何格式化指数?例如。没有前导0(2位)或总是3或4位(1或2个前导零)。

1 个答案:

答案 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,然后使用一些油腻的正则表达式修改来规范化格式。不完全是一个令人愉快的解决方案,但你做了你必须做的事情。