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

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 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"

因此,例如,我们得到 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"
\\+ 删除 + (?&lt;=...)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 对平台依赖性的评论,我将选择(?&lt;=e)\\+?0*|(?&lt;=e-)0* @tennenrishin 好东西。不过我认为你不需要* 如果没有*,正则表达式将无法完全适用于“1e+10”和“1e+005”等情况。 @tennenrishin 因为你需要使用options( scipen ),我相信你设置options( scipen = 0 )options( scipen = -1 ) 你会接近你想要的......但是由于方式R 将1e3 打印为1e+03,例如,您不会在一个函数中完全得到它。你必须为此做一些额外的处理。

以上是关于如何格式化数字以获得最小的字符串长度的主要内容,如果未能解决你的问题,请参考以下文章

随机生成密码,长度6-10位、不可包含特殊字符、必须包含大写、小写和数字,oracle 如何实现?

如何格式化数字以具有相同的位数?

如何通过格式化数字来设置TextField的字符长度

输入四个字符后如何编写UItextfield长度和更改键盘数字格式的条件

lua 如何匹配固定长度的字符串?

注册填写密码,最小长度为6个字符是啥