4

我正在编写一个自定义print.xx函数来显示一堆漂亮的数据。列宽是 11 个字符,所以我这样做:

> format(1234.567,width=11,digits=7)
[1] "   1234.567"
> format(1234.56789,width=11,digits=7)
[1] "   1234.568"

到目前为止,一切都很好。当我有一个非常大/小的数字并且科学记数法出现时,问题就来了:

> format(1234.56789e10,width=11,digits=7)
[1] "1.234568e+13"
> format(1234.56789e-10,width=11,digits=7)
[1] "1.234568e-07"

它应该使用科学计数法,好的,但我需要它坚持 11 个字符的宽度。我查看了scientificandscipen参数,但它仍然超出了 11 个字符的限制。一个选项可能是检查是否生成了科学记数法,如果是,则减少digits参数,但对我来说看起来很俗气。

无论数字是否采用科学计数法,我如何强制它给我一个固定长度的字符串?

4

3 回答 3

7

我认为你必须适当地计算数字。也许这样的事情会起作用:

n <- 1234.567e2
prettyNum(n, digits=7-(nchar(n)-11), width=11, format="fg")
# [1] "   123456.7"

n <- 1234.567e9
prettyNum(n, digits=7-(nchar(n)-11), width=11, format="fg")
# [1] "1.23457e+12"

n <- 1234.567e100
prettyNum(n, digits=7-(nchar(n)-11), width=11, format="fg")
# [1] "1.2346e+103"

或等效地format

format(n, digits=7-(nchar(n)-11), width=11)
于 2013-08-06T01:50:55.373 回答
5

就我而言,我使用了:

sprintf("%11.5e",123456789e10)

[1] "1.23457e+18"

你只需要知道你想要多少个字符并在 width.decimal 之间做适当的平衡,即 %11.5e

于 2014-11-29T02:37:30.943 回答
0
> sprintf("%0.6g", 1234.56789e-10)
[1] "1.23457e-07"
> sprintf("%0.6g", 1234.56789e10)
[1] "1.23457e+13"
于 2013-08-06T01:49:27.380 回答