保持科学计数法中的格式宽度

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个字符的长度限制。我查找了scientificscipen参数,但仍然超出了11个字符的限制。一个解决方案可能是检查是否生成了科学计数法,如果是,则减少digits参数,但这看起来有些不专业。

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

3个回答

8

我想你需要适当地计算这些数字。也许像这样做可以起作用:

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(n, digits=7-(nchar(n)-11), width=11)

5
在我的例子中,我使用了以下代码:

sprintf("%11.5e",123456789e10)

[1] "1.23457e+18"

你只需要知道想要多少个字符,并在宽度和小数点之间保持正确平衡,即%11.5e。

0
> sprintf("%0.6g", 1234.56789e-10)
[1] "1.23457e-07"
> sprintf("%0.6g", 1234.56789e10)
[1] "1.23457e+13"

sprintf("%0.6g", 1234.56789e100) 超出了11位: "1.23457e+103" - Julián Urbano
你有责任提出一组测试用例来定义合理值的范围。如果您需要处理指数中的3个数字,那么只需使用:sprintf(“%0.5g”,1234.56789e100) - IRTFM
1
好的,所以“你需要自己处理指数的大小”。干杯。 - Julián Urbano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接