【问题标题】:How to separate thousands with space [duplicate]如何用空格分隔数千 [重复]
【发布时间】:2015-06-05 03:20:22
【问题描述】:

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

我尝试过的:

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"

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

【问题讨论】:

  • 我能问一下您为什么要这样做吗?它主要用于 display 还是主要用于 manipulation (即您是否尝试制作一个每千之间有空格的漂亮报告,或者您是否尝试在R?)?
  • 只是为了美观!
  • 确实是重复的。但我认为这不应该被关闭。我不是一个很好的英语交流者,因此有时很难在 SO 上找到你想要的东西(我只找到了一个 C 解决方案..)。如果其他用户使用不同的搜索词,这个具有不同标题的问题可以让他们找到解决方案! (并避免他们发布自己丑陋的临时功能;))
  • 如果解决方案作为副本关闭,其他用户会更容易找到解决方案,因为这将两个问题联系在一起。这样做真的没有坏处。

标签: regex r


【解决方案1】:

这似乎更适合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"

【讨论】:

    【解决方案2】:
    x<-100000000
    prettyNum(x,big.mark=" ",scientific=FALSE)
    [1] "100 000 000"
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-17
        • 2017-01-25
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多