如何格式化最小字符串长度的数字

时间:2013-10-11 11:13:26

标签: r format printf

对于具有严格空间约束的图形注释,我想以最小化每个数字的表示字符串长度的方式格式化数字。例如,10的幂应格式如下:

  • 1E-4
  • 1E-3
  • 0.01
  • 0.1
  • 1
  • 10
  • 100
  • 1E3
  • 1E4

as.character几乎可以做到这一点,但不幸的是,它在单位数指数中放置了一个冗余的前导零,并且在正指数之前插入了一个冗余的“+”。

> as.character(10^(-5:5))
 [1] "1e-05" "1e-04" "0.001" "0.01"  "0.1"   "1"     "10"    "100"   "1000"  "10000" "1e+05"

因此,代替1e5,我们得到1e + 05,这几乎是双倍的长度。

1 个答案:

答案 0 :(得分:2)

如何使用regex删除不需要的字符......

gsub( "\\+|(?<=\\+|\\-)0" , "" , 10^(-5:5) , perl = TRUE )
#[1] "1e-5"  "1e-4"  "0.001" "0.01"  "0.1"   "1"     "10"    "100"   "1000" 
#[10] "10000" "1e5"
  • \\+删除+
  • (?<=...)0是一个零宽度的后瞻断言,只要0中的任何内容出现...,就会删除\\+|\\-+ -|

""分隔符链接表达式。 gsub的第二个参数中的formatBrief <- function(x){ options(scipen=-5) sci <- gsub( "(?<=e)\\+?0*|(?<=e-)0*" , "" , x , perl=TRUE) options(scipen=5) fp <- as.character(x) options(scipen=0) return (ifelse(nchar(sci)<nchar(fp),sci,fp)) } > formatBrief(10^(-5:5)) [1] "1e-5" "1e-4" "1e-3" "0.01" "0.1" "1" "10" "100" "1e3" "1e4" "1e5" 将替换为空的匹配。

编辑:基于讨论中提出的想法,这是一个现成的解决方案:

{{1}}
相关问题