【问题标题】:r Format numbers with 0 and dashesr 用 0 和破折号格式化数字
【发布时间】:2017-09-11 05:57:57
【问题描述】:

我正在处理下面这样的数字

   12344
  233345
 7233433
 9343883
 3432837

我正在尝试格式化这些数字,以使它们的长度相同,并且每三个数字后面都有破折号 (-)。最终的预期结果应如下所示。

  0-012-344
  0-233-345
  7-233-433
  9-343-883
  3-432-837

非常感谢以这种方式格式化这些数字的任何帮助。

【问题讨论】:

    标签: r number-formatting


    【解决方案1】:

    试试formatC:

    formatC(x, width = 7, format = "d", flag = "0", big.mark = '-')
    # [1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
    

    使用的数据:

    x <- scan(textConnection('12344
    233345
    7233433
    9343883
    3432837'))
    

    【讨论】:

      【解决方案2】:

      这是另一种解决方案,

      my_format <- function(num){
      x <- sprintf("%07d", num)
      paste0(substr(x, 1,1), "-",
          substr(x, 2,4), "-",
          substr(x, 5,7))
      }
      
      nums <-  c(12344,233345,7233433,9343883,3432837)
      my_format(nums)
      
      # gives
      [1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
      

      【讨论】:

        【解决方案3】:

        我们可以使用stringrpurrr

        # Data
        numbers <- c("12344", "233345", "7233433", "9343883", "3432837")
        
        # Load package
        library(stringr)
        library(purrr)
        
        # A function to add dash line
        trans_num <- function(number){
          part1 <- str_sub(number, start = 1, end = 1)
          part2 <- str_sub(number, start = 2, end = 4)
          part3 <- str_sub(number, start = 5)
          return(paste(part1, part2, part3, sep = "-"))
        }
        
        numbers %>%
          str_pad(width = 7, pad = "0") %>%
          map_chr(trans_num)
        [1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
        

        【讨论】:

          【解决方案4】:

          这是一个base R 选项,带有subsprintf

          sub("(.)(.{3})", '\\1-\\2-', sprintf("%07d", x))
          #[1] "0-012-344" "0-233-345" "7-233-433" "9-343-883" "3-432-837"
          

          【讨论】:

            【解决方案5】:

            首先,您需要构建长度为 7 且带有前导零的字符串。我用this

            strReverse <- function(x)
                sapply(lapply(strsplit(x, NULL), rev), paste, collapse="")
            
            v = as.character(read.table(text = "   12344
              233345
             7233433
             9343883
             3432837", header = FALSE)[,1])
            
            v1 = strReverse( substring(paste0(strReverse(v), "0000"), 1, 7))
            

            结果:

            > v1
            [1] "0012344" "0233345" "7233433" "9343883" "3432837"
            

            现在添加破折号应该很简单:

            paste0(substring(v1,1,1), "-", substring(v1,2,4), "-", substring(v1,5,7))
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多