【问题标题】:Return a number as a comma-delimited string以逗号分隔的字符串形式返回一个数字
【发布时间】:2017-10-13 06:36:07
【问题描述】:

背景

由于bug in Renjinformat 系列函数不可用,但sprintf 有效。

代码

这是一个将数字转换为逗号分隔的字符串的替换函数:

commas <- function( n ) {
  s <- sprintf( "%03.0f", n %% 1000 )
  n <- n %/% 1000

  while( n > 0 ) {
    s <- concat( sprintf( "%03.0f", n %% 1000 ), ',', s )
    n <- n %/% 1000
  }

  gsub( '^0*', '', s )
}

问题

在代码完成工作的同时,如何加快实现速度?也就是说,如何编写代码以使用R白话(没有使用formatformatCprettyNum等)并且没有损坏Renjin packages(即,没有依赖项)?

【问题讨论】:

    标签: r numbers format comma renjin


    【解决方案1】:

    您可以使用一种巧妙的单行符将数千个逗号分隔符添加到数字的整数位,而无需将它们添加到小数部分。使用 stringr 包中的 str_replace_all,我们可以这样使用:

    num <- "1234567890.12345"
    str_replace_all(num, "[0-9](?=(?:[0-9]{3})+(?![0-9])(?=\\.))", "\\0,")
    [1] "1,234,567,890.12345"
    

    Demo

    【讨论】:

    【解决方案2】:

    不幸的是,许多 Renjin 包没有完全实现,所以在修复到位之前,问题中的代码是一个不错的解决方法:

    commas <- function( n ) {
      s <- sprintf( "%03.0f", n %% 1000 )
      n <- n %/% 1000
    
      while( n > 0 ) {
        s <- concat( sprintf( "%03.0f", n %% 1000 ), ',', s )
        n <- n %/% 1000
      }
    
      gsub( '^0*', '', s )
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多