如何将千位与空间分开

时间:2015-06-04 15:41:52

标签: regex r

我想格式化数字,以便每千个用空格分隔。

我尝试过的事情:

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"

我觉得编写这个临时功能非常糟糕,但由于我还没有掌握正则表达式,这是我发现它的唯一方法。当然,如果数字以科学格式转换,它将不会起作用。

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:10)

x<-100000000
prettyNum(x,big.mark=" ",scientific=FALSE)
[1] "100 000 000"

答案 2 :(得分:7)

我同意其他答案,使用其他工具(例如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"

基本上它会查找一个数字,后面跟着一组或多组3个数字(后跟一个非数字或字符串的结尾)并将数字替换为自身加上一个空格(前方部分不会出现在替补中,因为它不是比赛的一部分,更多是比赛的条件)。