简短版本:使用formatC
or sprintf
。
更长的版本:
有几个函数可用于格式化数字,包括添加前导零。哪个最好取决于您想要执行的其他格式。
问题中的示例非常简单,因为所有值的开头位数都相同,所以让我们尝试一个更难的示例,也可以将 10 的幂设为 8。
anim <- 25499:25504
x <- 10 ^ (0:5)
paste
(它的变体paste0
)通常是您遇到的第一个字符串操作函数。它们并不是真正为操纵数字而设计的,但它们可以用于此目的。在我们总是必须在前面加上一个零的简单情况下,这paste0
是最好的解决方案。
paste0("0", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
对于数字中位数可变的情况,您必须手动计算要添加多少个零,这太可怕了,您应该出于病态的好奇心才这样做。
str_pad
from 的stringr
工作方式与 类似paste
,使您想要填充的内容更加明确。
library(stringr)
str_pad(anim, 6, pad = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
同样,它并不是真正为数字使用而设计的,因此更难的情况需要稍微考虑一下。我们应该只能说“用零填充到宽度 8”,但看看这个输出:
str_pad(x, 8, pad = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "0001e+05"
您需要设置科学惩罚选项,以便始终使用固定表示法(而不是科学计数法)格式化数字。
library(withr)
with_options(
c(scipen = 999),
str_pad(x, 8, pad = "0")
)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
stri_pad
在与fromstringi
完全一样的作品中。str_pad
stringr
formatC
是 C 函数的接口printf
。使用它需要对该底层功能的奥秘有一些了解(见链接)。在这种情况下,重点是width
参数,format
用于"d"
“整数”,a"0"
flag
用于前置零。
formatC(anim, width = 6, format = "d", flag = "0")
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
formatC(x, width = 8, format = "d", flag = "0")
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
这是我最喜欢的解决方案,因为它很容易修改宽度,并且该功能足够强大,可以进行其他格式更改。
sprintf
是同名C函数的接口;喜欢formatC
,但语法不同。
sprintf("%06d", anim)
## [1] "025499" "025500" "025501" "025502" "025503" "025504"
sprintf("%08d", x)
## [1] "00000001" "00000010" "00000100" "00001000" "00010000" "00100000"
的主要优点sprintf
是您可以将格式化的数字嵌入较长的文本中。
sprintf(
"Animal ID %06d was a %s.",
anim,
sample(c("lion", "tiger"), length(anim), replace = TRUE)
)
## [1] "Animal ID 025499 was a tiger." "Animal ID 025500 was a tiger."
## [3] "Animal ID 025501 was a lion." "Animal ID 025502 was a tiger."
## [5] "Animal ID 025503 was a tiger." "Animal ID 025504 was a lion."
另见goodside的回答。
为了完整起见,值得一提的是其他偶尔有用的格式化函数,但没有添加零的方法。
format
, 用于格式化任何类型对象的通用函数,具有数字方法。它的工作方式有点像formatC
,但还有另一个界面。
prettyNum
是另一个格式化函数,主要用于创建手动轴刻度标签。它特别适用于范围广泛的数字。
该scales
包具有多种功能,例如percent
,date_format
和dollar
用于专业格式类型。