以逗号分隔的字符串形式返回一个数字
Posted
技术标签:
【中文标题】以逗号分隔的字符串形式返回一个数字【英文标题】:Return a number as a comma-delimited string 【发布时间】:2017-10-13 06:36:07 【问题描述】:背景
由于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(即,没有依赖项)?
【问题讨论】:
【参考方案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
【讨论】:
str_replace_all
在仁进也坏了。见:packages.renjin.org/package/org.renjin.cran/stringr/1.2.0/build/…
@DaveJarvis 我不熟悉stringr
被破坏。我的基本答案是使用正则表达式。如果这不符合您的期望,您可以尝试其他方法。【参考方案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 )
【讨论】:
以上是关于以逗号分隔的字符串形式返回一个数字的主要内容,如果未能解决你的问题,请参考以下文章