All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.zipwhip.util.InternationalNumberUtil Maven / Gradle / Ivy

package com.zipwhip.util;

import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber;

/**
 * Created with IntelliJ IDEA.
 * User: jed
 * Date: 7/9/12
 * Time: 1:38 PM
 */
public class InternationalNumberUtil {

    // Region-code for the unknown region as defined internally in libphonenumber
    public static final String UNKNOWN_REGION = "ZZ";

    protected static final String PLUS = "+";
    protected static final String ONE = "1";
    protected static final String ZERO = "0";
    protected static final String PLUS_ONE = "+1";

    /**
     * Given a valid international number or a valid Zipwhip Domestic number this function will return
     * the region code for the number or 'ZZ' if the region can not be determined.
     * 

* If the number is considered Zipwhip Domestic (10 digits without a leading '+1') then it will be * converted to e.164. Converted numbers are not guaranteed to return a region code. * * @param mobileNumber A valid international number or a valid Zipwhip Domestic number * @return The region code for the number or 'ZZ' if the region can not be determined. */ public static String getRegionCode(String mobileNumber) { if (isValidZipwhipDomesticNumberFormat(mobileNumber)) { mobileNumber = internationalizeZipwhipDomesticNumber(mobileNumber); } if (!isValidInternationalNumber(mobileNumber)) { return UNKNOWN_REGION; } Phonenumber.PhoneNumber phoneNumber; try { phoneNumber = PhoneNumberUtil.getInstance().parse(mobileNumber, UNKNOWN_REGION); } catch (NumberParseException e) { return UNKNOWN_REGION; } if (phoneNumber.hasCountryCode()) { String regionCode = PhoneNumberUtil.getInstance().getRegionCodeForNumber(phoneNumber); return StringUtil.exists(regionCode) ? regionCode : UNKNOWN_REGION; } return UNKNOWN_REGION; } /** * Given a mobile number this method will determine if the number is e.164 * compliant and therefore internationally routable. * * @param mobileNumber The mobile number to be validated. * @return true if the number is valid. */ public static boolean isValidInternationalNumber(String mobileNumber) { Phonenumber.PhoneNumber phoneNumber; try { phoneNumber = PhoneNumberUtil.getInstance().parse(mobileNumber, UNKNOWN_REGION); } catch (NumberParseException e) { return false; } return PhoneNumberUtil.getInstance().isValidNumber(phoneNumber); } /** * A Zipwhip Domestic number is a number in the North American Numbering Plan. *

* To be in a valid format for Zipwhip Domestic the number must be 10 digits and not start with '+1' * * @param mobileNumber The mobile number to be validated. * @return true if mobileNumber has a length of 10 and does not start with '+1' */ public static boolean isValidZipwhipDomesticNumberFormat(String mobileNumber) { if (StringUtil.isNullOrEmpty(mobileNumber) || mobileNumber.startsWith(PLUS) || mobileNumber.startsWith(ZERO) || mobileNumber.startsWith(ONE) || mobileNumber.length() != 10) { return false; } try { Long.parseLong(mobileNumber); return true; } catch (NumberFormatException e) { return false; } } /** * This method will return an internationally routable number. *

* The precondition of this method is that {@code isValidZipwhipDomesticNumberFormat} * returns true for mobileNumber. If {@code isValidZipwhipDomesticNumberFormat} returns * false then mobileNumber is returned unmodified. * * @param mobileNumber The Zipwhip Domestic mobile number to be internationalized. * @return The internationalized Zipwhip Domestic mobile number. */ public static String internationalizeZipwhipDomesticNumber(String mobileNumber) { if (!isValidZipwhipDomesticNumberFormat(mobileNumber)) { return mobileNumber; } return PLUS_ONE + mobileNumber; } /** * Use this method for formatting a user's contacts relative to the user's local region code. * * @param mobileNumber The contact mobile number to be formatted for display. * @param usersRegionCode The region code of the user's region, NOT necessarily the region of the mobileNumber. * @return The mobile number formatted to the local format or internal format of it is an international number. */ public static String getFormattedNumberForContact(String mobileNumber, String usersRegionCode) { PhoneNumberUtil.PhoneNumberFormat format; String defaultRegion; if (isValidInternationalNumber(mobileNumber)) { // If we have a valid e.164 number we can ignore the usersRegionCode defaultRegion = UNKNOWN_REGION; format = PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL; } else { defaultRegion = usersRegionCode; format = PhoneNumberUtil.PhoneNumberFormat.NATIONAL; } return getFormattedNumber(mobileNumber, defaultRegion, format); } /** * Use this method for formatting a user's mobile number relative to the user's local region code. * * @param mobileNumber The user's mobile number to be formatted for display. * @param usersRegionCode The region code of the user's region, NOT necessarily the region of the mobileNumber. * @return The mobile number formatted to the local format or internal format of it is an international number. */ public static String getFormattedNumberForUser(String mobileNumber, String usersRegionCode) { String defaultRegion; if (isValidInternationalNumber(mobileNumber)) { // If we have a valid e.164 number we can ignore the usersRegionCode defaultRegion = UNKNOWN_REGION; } else { defaultRegion = usersRegionCode; } return getFormattedNumber(mobileNumber, defaultRegion, PhoneNumberUtil.PhoneNumberFormat.NATIONAL); } protected static String getFormattedNumber(String mobileNumber, String usersRegionCode, PhoneNumberUtil.PhoneNumberFormat format) { try { Phonenumber.PhoneNumber phoneNumber = PhoneNumberUtil.getInstance().parse(mobileNumber, usersRegionCode); return PhoneNumberUtil.getInstance().format(phoneNumber, format); } catch (NumberParseException e) { return mobileNumber; } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy