marmelroy / PhoneNumberKit

A Swift framework for parsing, formatting and validating international phone numbers. Inspired by Google's libphonenumber.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Getting invalid phone number as valid

sharukmsd opened this issue · comments

New Issue Checklist

Steps to reproduce

phoneNumberKit.isValidPhoneNumber("5555555555", withRegion: "PK") is returning true

Expected result

It should return false because the correct Pakistan numbers format is +923*******

Actual result

It validates an invalid number "5555555555" by returning true

FYI: Pakistan number shouldn't start with some invalid e.g +92876543845 or +925555555555.

Environment

I'm using Cocoapods to integrate PhoneNumberKit

I didn’t the issue.

valid numbers for pakistan start with 3******* or +923*******, not with 5*******

I didn’t the issue.

Got it. Well, PNK relies on the metadata provided by libPhoneNumber from Google, and the number provided is considered valid on that lib.
You might need to report this issue there.

Following code resolves the issue, thanks for the help @bguidolim

    func validateNumberLengthAndFormat(_ number: String) -> Bool {
        let nonFormattedNumber = number.replacingOccurrences(of: " ", with: "")
        if nonFormattedNumber.count >= validNumberLength {
            let numberToFormat = String(nonFormattedNumber.prefix(validNumberLength))
            let formattedNumber = phoneNumberValidaor.formatNumber(numberToFormat, forRegion: selectedCounrty.regionId)
            if formattedNumber != phoneNumberInput {
                phoneNumberInput = formattedNumber
                return phoneNumberValidaor.isValidPhoneNumber(phoneNumberInput, forRegion: selectedCounrty.regionId)
            }
        }
        return false
    }

and here's PhoneNumberValidator

class PhoneNumberValidator {
    
    let phoneNumberKit = PhoneNumberKit()
    
    func isValidPhoneNumber(_ number: String, forRegion regionId: String) -> Bool {
        return phoneNumberKit.isValidPhoneNumber(number, withRegion: regionId)
    }
    
    func formatNumber(_ number: String, forRegion regionId: String) -> String {
        let phoneNumber = try? phoneNumberKit.parse(number, withRegion: regionId)
        guard let phoneNumber = phoneNumber else {
            return number
        }
        let formattedNumber = phoneNumberKit.format(
            phoneNumber, toType: .national, withPrefix: false)
            .replacingOccurrences(of: "^0+", with: "", options: .regularExpression
        )
        return formattedNumber
    }
    
}