package net.frontlinesms.ui.i18n; import net.frontlinesms.AppProperties; /** * International area codes * This has been taken from http://countrycode.org/, using the following regexp * Find: .*(([A-Z]{2}) / [A-Z]* ([0-9 ]*[0-9]+)).* * Replace: \2\(\"\3\"), * @author Morgan Belkadi <morgan@frontlinesms.com> */ public enum CountryCallingCode { AF("93"), AL("355"), DZ("213"), AS("1684"), AD("376"), AO("244"), AI("1264"), AQ("672"), AG("1268"), AR("54"), AM("374"), AW("297"), AU("61"), AT("43"), AZ("994"), BS("1242"), BH("973"), BD("880"), BB("1246"), BY("375"), BE("32"), BZ("501"), BJ("229"), BM("1441"), BT("975"), BO("591"), BA("387"), BW("267"), BR("55"), VG("1284"), BN("673"), BG("359"), BF("226"), MM("95"), BI("257"), KH("855"), CM("237"), CA("1"), CV("238"), KY("1345"), CF("236"), TD("235"), CL("56"), CN("86"), CX("61"), CC("61"), CO("57"), KM("269"), CK("682"), CR("506"), HR("385"), CU("53"), CY("357"), CZ("420"), CD("243"), DK("45"), DJ("253"), DM("1767"), DO("1809"), EC("593"), EG("20"), SV("503"), GQ("240"), ER("291"), EE("372"), ET("251"), FK("500"), FO("298"), FJ("679"), FI("358"), FR("33"), PF("689"), GA("241"), GM("220"), GE("995"), DE("49"), GH("233"), GI("350"), GR("30"), GL("299"), GD("1473"), GU("1671"), GT("502"), GN("224"), GW("245"), GY("592"), HT("509"), VA("39"), HN("504"), HK("852"), HU("36"), IS("354"), IN("91"), ID("62"), IR("98"), IQ("964"), IE("353"), IM("44"), IL("972"), IT("39"), CI("225"), JM("1876"), JP("81"), JE("44"), JO("962"), KZ("7"), KE("254"), KI("686"), KW("965"), KG("996"), LA("856"), LV("371"), LB("961"), LS("266"), LR("231"), LY("218"), LI("423"), LT("370"), LU("352"), MO("853"), MK("389"), MG("261"), MW("265"), MY("60"), MV("960"), ML("223"), MT("356"), MH("692"), MR("222"), MU("230"), YT("262"), MX("52"), FM("691"), MD("373"), MC("377"), MN("976"), ME("382"), MS("1664"), MA("212"), MZ("258"), NA("264"), NR("674"), NP("977"), NL("31"), AN("599"), NC("687"), NZ("64"), NI("505"), NE("227"), NG("234"), NU("683"), KP("850"), MP("1670"), NO("47"), OM("968"), PK("92"), PW("680"), PA("507"), PG("675"), PY("595"), PE("51"), PH("63"), PN("870"), PL("48"), PT("351"), PR("1"), QA("974"), CG("242"), RO("40"), RU("7"), RW("250"), BL("590"), SH("290"), KN("1869"), LC("1758"), MF("1599"), PM("508"), VC("1784"), WS("685"), SM("378"), ST("239"), SA("966"), SN("221"), RS("381"), SC("248"), SL("232"), SG("65"), SK("421"), SI("386"), SB("677"), SO("252"), ZA("27"), KR("82"), ES("34"), LK("94"), SD("249"), SR("597"), SZ("268"), SE("46"), CH("41"), SY("963"), TW("886"), TJ("992"), TZ("255"), TH("66"), TL("670"), TG("228"), TK("690"), TO("676"), TT("1868"), TN("216"), TR("90"), TM("993"), TC("1649"), TV("688"), UG("256"), UA("380"), AE("971"), GB("44"), US("1"), UY("598"), VI("1340"), UZ("998"), VU("678"), VE("58"), VN("84"), WF("681"), YE("967"), ZM("260"), ZW("263"); private final String countryCode; CountryCallingCode (String countryCode) { this.countryCode = countryCode; } public String getCountryCode() { return countryCode; } /** * @param 2-letter country ISO country code */ static String getCountryCode(String country) { if (country == null || country.length()==0) { return ""; } else { CountryCallingCode code = valueOf(country.toUpperCase()); return code == null ? "" : code.getCountryCode(); } } /** * Tries to format the given phone number into a valid international format. * @param phoneNumber A non-formatted phone number */ public static String format(String phoneNumber, String countryCode) { // Remove the (0) sometimes present is certain numbers. // This 0 MUST NOT be present in the international formatted number String formattedNumber = phoneNumber.replace("(0)", ""); // Remove every character which is not a digit formattedNumber = formattedNumber.replaceAll("\\D", ""); if (phoneNumber.startsWith("+")) { // If the original number was prefixed by ++, // we put it back return "+" + formattedNumber; } else if (formattedNumber.startsWith("00")) { // If the number was prefixed by the (valid) 00(code) format, // we transform it to the + sign return "+" + formattedNumber.substring(2); } else if (formattedNumber.startsWith(getCountryCode(countryCode))) { // If the number was prefixed by the current country code, // we just put a + sign back in front of it. return "+" + formattedNumber; } else if (formattedNumber.startsWith("0")) { // Most internal numbers starts with one 0. We'll have to remove it // Before putting a + sign in front of it. formattedNumber = formattedNumber.substring(1); } // NB: even if a + sign had been specified, it's been removed by the replaceAll function // We have to put one back. // We also try to prefix the number with the current country code return "+" + getCountryCode(countryCode) + formattedNumber; } /** * @param msisdn A phone number * @return <code>true</code> if the number is in a proper international format, <code>false</code> otherwise. */ public static boolean isInInternationalFormat(String msisdn) { return msisdn.matches("\\+\\d+"); } }