【问题标题】:How to use sprintf function to add leading "0" instead of spaces to character?如何使用 sprintf 函数在字符中添加前导“0”而不是空格?
【发布时间】:2014-06-05 15:07:25
【问题描述】:

我正在尝试使用sprintf 函数将前导“0”添加到字符,并使所有字符的长度相同。但是我得到的是领先的空间。

我的代码:

a <- c("12","123", "1234")
sprintf("%04s",a)
[1] "  12" " 123" "1234"

我想得到什么:

[1] "0012" "0123" "1234"

sprintf 手册说:“对于字符,这个零填充在某些平台上,而在其他平台上被忽略。”

我的版本: 平台 x86_64-w64-mingw32
拱 x86_64
操作系统 mingw32
系统 x86_64、mingw32
状态
专业 3
次要 1.0
2014 年
04月
第 10 天
svn 版本 65387
语言 R
version.string R 版本 3.1.0 (2014-04-10) 绰号春舞

【问题讨论】:

  • 您需要更多示例才能知道您要做什么。正如手册所说,有时这在其他系统上会被忽略。也许sprintf("%07d",125)
  • 这个问题有帮助吗:stackoverflow.com/questions/8266915/…
  • 另见this answer
  • 它适用于我(OSX 10.8.4 上的 R 3.0.2)。您是否尝试将字符向量转换为数值向量?
  • @beginneR @RichardScriven 当向量的所有元素长度相同时,这可能是一个解决方案。但是,当元素具有不同的长度并且 OP 想要将所有元素转换为具有前导零的相同长度时,paste(或paste0)将无法提供所需的解决方案。

标签: r printf padding


【解决方案1】:

如果你在一个只插入空格的平台上,正则表达式是你的朋友。类似的东西

foo<- gsub('^[ ]{1,}','0',bar)

这将用 0 替换所有前导空格。我知道可以告诉正则表达式用N 零字符替换N 空格,但我忘记了具体方法。

编辑:对于那些paste0 反对者,怎么样:

wantlength <- 12 # the desired final string size, fully zero padded
paste0( paste0(rep('0',wantlength-nchar(foo)),collapse='') ,foo)

【讨论】:

  • 更简单一点,gsub('^ +', '0', bar)gsub('^\\s+', '0', bar) 匹配所有前导空白字符。但是可以安全地假设前导空格是字符串中唯一的空格(我们是填充数字吗?),所以我们可以gsub('\\s', '0', bar)
  • 谢谢各位。我认为 jbaums 的函数:gsub('^\\s+', '0', bar) 解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多