根据国家/地区代码格式化电话号码

时间:2017-01-20 19:12:37

标签: r substr

我正在制作一个闪亮的应用程序,我想显示联系人的电话号码。如果该号码是美国号码,我想以特定格式显示,例如(XXX) XXX- XXXX否则我只想按原样返回该号码。

我使用substr尝试了最简单的方法。这是我的功能。

telFormat <- function(x){
  if (is.na(x)){
    return ("")
  }
  if(substr(x,1,3) %in% c("+1 ")){
    p1 <- substr(x,4,6)
    p2 <- substr(x,8,10)
    p3 <- substr(x, 12,15)
    return (paste("(",p1,") ",p2,"-",p3, sep = ""))
  }
  else 
    return (x)
}

我的样本数据是:

sample <- c("+1 312 252 7546", "+1 678 538 1919", "+44 (0) 207 743 4052", 
            "+44 (0) 207 743 3000", "+1 212 810 5300", NA, "+44 (0) 207 591 6630", 
            "+61 2 9272 2200", "+852 3903 2448", "+1 415 670 6267", "+44 (0) 207 743 3000", 
            "+1 212 810 5300", "+1 919 743 2500", "+1 919 743 2500", "+1 919 743 2500", 
            "+1 919 743 2500")

+1开头的电话号码输出正确转换,但其他数字有问题。

telFormat(sample)

#output
[1] "(312) 252-7546" "(678) 538-1919" "( (0)  20- 743" "( (0)  20- 743" "
(212) 810-5300" "(NA) NA-NA"     "( (0)  20- 591"
 [8] "( 2 ) 272-2200" "(2 3) 03 -448"  "(415) 670-6267" "( (0)  20- 743" "
(212) 810-5300" "(919) 743-2500" "(919) 743-2500"
[15] "(919) 743-2500" "(919) 743-2500"

我也收到了这条警告信息

Warning messages:
1: In if (is.na(x)) { :
  the condition has length > 1 and only the first element will be used
2: In if (substr(x, 1, 3) %in% c("+1 ")) { :
  the condition has length > 1 and only the first element will be used

我在这里做错了什么?有没有一种有效的方法来获得所需的输出?

2 个答案:

答案 0 :(得分:0)

如果您数据中的所有美国号码都有特定格式,即+1 XXX XXX XXXX,您可以使用正则表达式^\\+1 (\\d{3}) (\\d{3}) (\\d{4})$重新格式化:

sub("^\\+1 (\\d{3}) (\\d{3}) (\\d{4})$", "(\\1) \\2-\\3", sample)

# [1] "(312) 252-7546"       "(678) 538-1919"       "+44 (0) 207 743 4052"
# [4] "+44 (0) 207 743 3000" "(212) 810-5300"       NA                    
# [7] "+44 (0) 207 591 6630" "+61 2 9272 2200"      "+852 3903 2448"      
#[10] "(415) 670-6267"       "+44 (0) 207 743 3000" "(212) 810-5300"      
#[13] "(919) 743-2500"       "(919) 743-2500"       "(919) 743-2500"      
#[16] "(919) 743-2500"  

这使用带括号的捕获组来匹配美国数字中的前三个,后三个和后四个数字,请参考这些模式,并使用后面引用\\并将数字作为替换。

答案 1 :(得分:0)

可能有点像这样的帮助stringr

library(stringr)
as.data.frame(do.call(rbind, lapply(str_match_all(sample[!is.na(sample)], 
        "(\\+1|.*)[^\\d]?(\\d+)[^\\d]+(\\d+)[^\\d]+(\\d+)$"), function(x) x[,2:5])))


            V1  V2   V3   V4
1           +1 312  252 7546
2           +1 678  538 1919
3  +44 (0) 20    7  743 4052
4  +44 (0) 20    7  743 3000
5           +1 212  810 5300
6  +44 (0) 20    7  591 6630
7        +61     2 9272 2200
8         +85    2 3903 2448
9           +1 415  670 6267
10 +44 (0) 20    7  743 3000
11          +1 212  810 5300
12          +1 919  743 2500
13          +1 919  743 2500
14          +1 919  743 2500
15          +1 919  743 2500