如何格式化数字以获得最小的字符串长度
Posted
技术标签:
【中文标题】如何格式化数字以获得最小的字符串长度【英文标题】:How to format numbers for minimal string length 【发布时间】:2013-10-11 11:13:25 【问题描述】:对于空间受限的图形注释,我想以最小化每个数字的表示字符串长度的方式格式化数字。例如,10 的幂应该这样格式化:
1e-4 1e-3 0.01 0.1 1 10 100 1e3 1e4as.character
似乎几乎做到了这一点,但不幸的是,它在个位数指数中放置了一个冗余的前导零,并在正指数之前插入了一个冗余的“+”。
> as.character(10^(-5:5))
[1] "1e-05" "1e-04" "0.001" "0.01" "0.1" "1" "10" "100" "1000" "10000" "1e+05"
因此,例如,我们得到 1e+05 而不是 1e5,它的长度几乎是两倍。
【问题讨论】:
formatC()
有帮助吗?
如果有办法让formatC()
做到这一点,我不知道怎么做。
来自?formatC
:科学格式的渲染依赖于平台:有些系统使用n.ddde+nnn或n.dddenn而不是n.ddde+nn。
sprintf("%.2E", n)
将强制使用 3 位有效数字的科学记数法。如果你想avoid regex,你可以开发一个函数来有条件地应用 sprintf 来实现你想要的。
【参考方案1】:
如何使用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"
【讨论】:
前两个不准确 好主意!由于@James 对平台依赖性的评论,我将选择(?<=e)\\+?0*|(?<=e-)0*
。
@tennenrishin 好东西。不过我认为你不需要*
。
如果没有*
,正则表达式将无法完全适用于“1e+10”和“1e+005”等情况。
@tennenrishin 因为你需要使用options( scipen )
,我相信你设置options( scipen = 0 )
或options( scipen = -1 )
你会接近你想要的......但是由于方式R 将1e3
打印为1e+03
,例如,您不会在一个函数中完全得到它。你必须为此做一些额外的处理。以上是关于如何格式化数字以获得最小的字符串长度的主要内容,如果未能解决你的问题,请参考以下文章
随机生成密码,长度6-10位、不可包含特殊字符、必须包含大写、小写和数字,oracle 如何实现?