Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library(data.table)
- dt <- data.table(ID = c(1:4),
- phone = c("0412 345 789","0438 123 456",
- "041 2345 543", "(02) 1234 5678",
- "9876 1234", "04123456789"),
- state = c("NSW","QLD","SA"),
- country = c("AU"),
- phone_countries = c("AU"))
- # ID phone state country phone_countries
- # 1: 1 0412 345 789 NSW AU AU
- # 2: 2 0438 123 456 QLD AU AU
- # 3: 3 041 2345 543 SA AU AU
- # 4: 4 (02) 1234 5678 NSW AU AU
- # 5: 1 9876 1234 QLD AU AU
- # 6: 2 04123456789 SA AU AU
- isValidPhone <- function(phone, state, country, validation_countries) {
- if (!(country %in% unlist(strsplit(validation_countries, ","))))
- return(FALSE)
- # remove whitespace, hyphens and brackets
- phone_clean <- gsub("[[:space:]]|-|\.|\(|\)", "", phone)
- if (is.na(phone_clean) | phone_clean == '' | is.na(iconv(phone_clean, "", "ASCII")))
- return(FALSE)
- if (country == "AU") {
- # append state area code if length is 8 digits
- #print(paste("phone:", phone_clean, "state:", state))
- if (nchar(phone_clean, "width") == 8)
- if (state %in% c('ACT', 'NSW', 'QLD', 'VIC', 'TAS', 'SA', 'NT', 'WA'))
- phone_clean <- switch (state,
- 'ACT' = paste0("02",phone_clean),
- 'NSW' = paste0("02",phone_clean),
- 'QLD' = paste0("07",phone_clean),
- 'VIC' = paste0("03",phone_clean),
- 'TAS' = paste0("03",phone_clean),
- 'SA' = paste0("08",phone_clean),
- 'NT' = paste0("08",phone_clean),
- 'WA' = paste0("08",phone_clean))
- if (nchar(phone_clean, "width") == 9)
- if(substr(phone_clean,1,1) %in% c(2:4,7,8))
- phone_clean <- paste0("0", phone_clean)
- return(grepl("^(?:\+?61|0)[23478](?:[ -]?[0-9]){8}$",
- as.character(phone_clean), ignore.case=TRUE))
- }
- }
- dt[, validphone := isValidPhone(phone, state, country, phone_countries), by = 1:nrow(dt)]
- # ID phone state country phone_countries validphone
- # 1: 1 0412 345 789 NSW AU AU TRUE
- # 2: 2 0438 123 456 QLD AU AU TRUE
- # 3: 3 041 2345 543 SA AU AU TRUE
- # 4: 4 (02) 1234 5678 NSW AU AU TRUE
- # 5: 1 9876 1234 QLD AU AU TRUE
- # 6: 2 04123456789 SA AU AU FALSE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement