我想格式化数字,以便每千个应该用空格分隔.
我尝试过的:
library(magrittr)
addSpaceSep <- function(x) {
x %>%
as.character %>%
strsplit(split = NULL) %>%
unlist %>%
rev %>%
split(ceiling(seq_along(.) / 3)) %>%
lapply(paste, collapse = "") %>%
paste(collapse = " ") %>%
strsplit(split = NULL) %>%
unlist %>%
rev %>%
paste(collapse = "")
}
> sapply(c(1, 12, 123, 1234, 12345, 123456, 123456, 1234567), addSpaceSep)
[1] "1" "12" "123" "1 234" "12 345" "123 456" "123 456"
[8] "1 234 567"
> sapply(c(1, 10, 100, 1000, 10000, 100000, 1000000), addSpaceSep)
[1] "1" "10" "100" "1 000" "10 000" "1e +05" "1e +06"
Run Code Online (Sandbox Code Playgroud)
写这个临时功能我感觉非常糟糕,但由于我没有掌握正则表达式,所以这是我发现它的唯一方法.当然,如果数字以科学格式转换,它将无法工作.
MrF*_*ick 12
这似乎更适合format()函数而不是打扰正则表达式.format()存在格式化数字的功能
format(c(1, 12, 123, 1234, 12345, 123456, 123456, 1234567), big.mark=" ", trim=TRUE)
# [1] "1" "12" "123" "1 234" "12 345" "123 456"
# [7] "123 456" "1 234 567"
format(c(1, 10, 100, 1000, 10000, 100000, 1000000), big.mark=" ", scientific=FALSE, trim=TRUE)
# [1] "1" "10" "100" "1 000" "10 000" "100 000"
# [7] "1 000 000"
Run Code Online (Sandbox Code Playgroud)
use*_*710 10
x<-100000000
prettyNum(x,big.mark=" ",scientific=FALSE)
[1] "100 000 000"
Run Code Online (Sandbox Code Playgroud)
我同意其他答案,使用其他工具(如format)是最好的方法.但是如果你真的想使用正则表达式和替换,那么这是一种使用Perl前瞻的方法.
> test <- c(1, 12, 123, 1234, 12345, 123456, 1234567, 12345678)
>
> gsub('(\\d)(?=(\\d{3})+(\\D|$))', '\\1 ',
+ as.character(test), perl=TRUE)
[1] "1" "12" "123" "1 234"
[5] "12 345" "123 456" "1 234 567" "12 345 678"
Run Code Online (Sandbox Code Playgroud)
基本上它会查找一个数字,后面跟着一组或多组3位数字(后面是非数字或字符串的结尾)并用自身替换数字加上一个空格(前方部分不会出现在替换中因为它不是比赛的一部分,更多是比赛的条件).