【问题标题】:Add a sign to number, except for 0, using sprintf使用 sprintf 为数字添加符号,0 除外
【发布时间】:2014-08-27 03:19:34
【问题描述】:

使用sprintf"%+d" 打印带符号的数字:

sprintf("%+d",-2:2)
[1] "-2" "-1" "+0" "+1" "+2"

是否有sprintf的参数自动转义0并得到以下?

[1] "-2" "-1" "0" "+1" "+2"

【问题讨论】:

  • 一通电话?因为你可以做到s <- sprintf("%+d",-2:2); s[s == "+0"] <- "0"; s
  • 我想知道我是否错过了sprintf 的选项。当然,您的解决方案有效。
  • @RichardScriven - 这可能是一行,但它是多个调用。
  • @thelatemail 我知道。我并不是说它是单行的。我在问 OP 他是否想要sprintf 作为一个电话,然后提出我的建议。

标签: r printf


【解决方案1】:

这是我在 C 中如何做到这一点的翻译。打印一个前导 + 表示正值,并依赖默认行为来表示非正值:

x <- -2:2
sprintf("%s%d", ifelse(x>0,"+",""), x)
## [1] "-2" "-1" "0"  "+1" "+2"

【讨论】:

  • ifelse(x == 0, 0, sprintf("%+d",x) ) - 是的。
  • 单线与sprintf("%s%d", ifelse((x &lt;- -2:2) &gt; 0,"+",""), x)
【解决方案2】:

您可以尝试使用 gsub 删除 +

 gsub("^\\+0$","0",sprintf("%+d",-2:2))
 [1] "-2" "-1" "0"  "+1" "+2"

【讨论】:

  • "[+]0" 正则表达式可能更简洁一些。
【解决方案3】:

另一个使用正向预测的 gsub 命令。

> gsub("[+](?=0)", "", sprintf("%+d",-2:2), perl=T)
[1] "-2" "-1" "0"  "+1" "+2"

在 regex 中,前瞻用于条件检查。 [+](?=0) 将匹配符号 +,仅当它后面跟着 0。用空字符串替换匹配的+ 会将+0 变成0

【讨论】:

  • 通过负前瞻gsub("[+](?![^0])", "", sprintf("%+d",-2:2), perl=T)
【解决方案4】:

解决这个问题的一种方法是

> s <- sprintf("%+d",-2:2)
> s[s == "+0"] <- 0
> s
# [1] "-2" "-1" "0"  "+1" "+2"

更新:我还发现你可以这样做...

> sprintf(c(rep("%d", 3), rep("%+d", 2)), -2:2)
# [1] "-2" "-1" "0"  "+1" "+2"

这需要特定数量的"%d"s,但这些可以很容易地计算/插入到rep 调用中以用于其他向量。它还对所有四个当前答案中最快的一个进行了基准测试。

【讨论】:

    猜你喜欢
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 2014-03-10
    • 2023-02-25
    相关资源
    最近更新 更多