【问题标题】:Use sprintf() to add trailing zeros使用 sprintf() 添加尾随零
【发布时间】:2015-11-11 17:43:56
【问题描述】:

必须有一个简单的方法来做到这一点,我忽略了它。但是,如果我有一系列 id 并想在未达到字符限制的地方添加尾随零。我在另一篇文章中看到了这个解决方案,但似乎找不到链接以供参考。

df$id <- c(2331,29623,311,29623)

这样做会得到前导零:

df$id_new <- sprintf("%05s", df$id)

但这样做不会得到尾随零:

df$id_new <- sprintf("%-05s", df$id)

回答

感谢下面的Richard,我拉了stringr这个包,用下面的来测试:

df$id_test &lt;- str_pad(df$id, width=5, side="right", pad="0")

制作:

id_test  
23310  
29623  
31100  
29623

【问题讨论】:

  • 尾随零使其成为不同的数字。为什么 sprintf 能够做到这一点?
  • 另外,您应该使用%d,但后者无关紧要。您可以使用stringi::stri_pad_right(id, 5, "0") 填充尾随零
  • 你可以将数字相乘sprintf("%g", nums*10^(5-nchar(nums)))
  • @RichardScriven "无效格式 '%05d';对字符对象使用格式 %s"
  • @stark 因为它是一个被读取为数字的 ID,并且所有 id 的字符数应该相同

标签: r


【解决方案1】:

正如 cmets 中所述,sprintf() 不会这样做。但是 stringi 包有填充功能,既快速又简单。

id <- c(2331, 29623, 311, 29623)

library(stringi)
stri_pad_left(id, 5, 0)
# [1] "02331" "29623" "00311" "29623"
stri_pad_right(id, 5, 0)
# [1] "23310" "29623" "31100" "29623"

这些函数直接分派给 C 代码,因此它们应该足够高效。

【讨论】:

  • 谢谢,我拉了stringr并使用了:df$id_test &lt;- str_pad(df$id, width=5, side="right", pad="0")
【解决方案2】:

我不认为 sprintf 这样做,但您可以使用 formatC 这样做

x <- 123    
formatC(as.numeric(x), format = 'f', flag='0', digits = 2)
[1] "123.00"

【讨论】:

  • 这不起作用,因为它将 0 放在小数点后。我需要在小数点前补齐。
  • gsub(".", "", formatC(as.numeric(x), format = 'f', flag='0', digits = 2), fixed = TRUE)
【解决方案3】:

如果我们坚持 - 我们可以欺骗 sprintf() 做它不想做的事情:

# Helper function from: stackoverflow.com/a/13613183/4552295
strReverse <- function(x) sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")

so_0padr <- function(x, width = 5) {
  strReverse(
    sprintf(
      "%0*d",
      width,
      as.integer(
        strReverse(
          as.character(x)
        )
      )
    )
  )
}

导致

so_0padr(c(2331,29623,311,29623))
[1] "23310" "29623" "31100" "29623"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多