Return 以逗号分隔的字符串形式的数字
Return a number as a comma-delimited string
背景
由于 bug in Renjin,format
系列函数不可用,但 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 白话( 而不是 使用 format
、formatC
、prettyNum
,以及喜欢)并且没有损坏 Renjin packages(即没有依赖性)?
您可以使用巧妙的单行代码将千位逗号分隔符添加到数字的整数位,而无需将它们添加到小数部分。使用 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"
不幸的是,许多 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 )
}
背景
由于 bug in Renjin,format
系列函数不可用,但 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 白话( 而不是 使用 format
、formatC
、prettyNum
,以及喜欢)并且没有损坏 Renjin packages(即没有依赖性)?
您可以使用巧妙的单行代码将千位逗号分隔符添加到数字的整数位,而无需将它们添加到小数部分。使用 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"
不幸的是,许多 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 )
}