【问题标题】:Keep format width in scientific notation以科学计数法保持格式宽度
【发布时间】:2013-08-06 21:15:28
【问题描述】:

我正在编写一个自定义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 参数,但对我来说看起来很俗气。

如何强制它给我一个固定长度的字符串,不管数字是否为科学计数法?

【问题讨论】:

    标签: r formatting pretty-print


    【解决方案1】:

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

    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)
    

    【讨论】:

      【解决方案2】:

      就我而言,我使用的是:

      sprintf("%11.5e",123456789e10)

      [1] "1.23457e+18"

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

      【讨论】:

        【解决方案3】:
        > 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"
        • 您有责任提出一组定义合理值范围的测试用例。如果您发现需要处理指数中的 3 位数字,则只需使用:sprintf("%0.5g", 1234.56789e100):
        • 好的,所以'你需要自己处理指数的大小'。干杯
        猜你喜欢
        • 1970-01-01
        • 2011-02-26
        • 2011-10-31
        • 2021-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多