今回したいこと
- 日本の電話番号(03-1234-5678)などを、E.164表記(+81312345678)に変換したい
- ついでにバリデーションも出来るといいかも
環境
- Node.js
ライブラリ
Googleが提供している電話番号をバリデーションと自動フォーマット可能なlibphonenumberのnpm版であるgoogle-libphonenumberを使用します。
google-libphonenumberの使用方法
インストール
npm install google-libphonenumber
例1)'202-456-1414'を'US'のE164表記に変換
// Require `PhoneNumberFormat`.constPNF=require('google-libphonenumber').PhoneNumberFormat;// Get an instance of `PhoneNumberUtil`.constphoneUtil=require('google-libphonenumber').PhoneNumberUtil.getInstance();// Parse number with country code and keep raw input.constnumber=phoneUtil.parseAndKeepRawInput('202-456-1414','US');// Format number in the E164 format.console.log(phoneUtil.format(number,PNF.E164));// => +12024561414
例2)全角・半角混合の日本の電話番号をE164表記に変換
// Require `PhoneNumberFormat`.constPNF=require('google-libphonenumber').PhoneNumberFormat;// Get an instance of `PhoneNumberUtil`.constphoneUtil=require('google-libphonenumber').PhoneNumberUtil.getInstance();constphoneNumbers=['03―1111―2222','03 1111 2222','(03)1111-2222','0312345678','03 1234 5678','03-1234-5678','(03)-1234-5678','09012345678','090-1234-5678','09012345678','090―1234―5678','0120-123-123']constreplacedNumbers=phoneNumbers.map(phoneNumber=>{constreplacedNumber=formatNumber(phoneNumber);returnreplacedNumber;})functionformatNumber(str){constnumber=phoneUtil.parseAndKeepRawInput(str,'JP');returnphoneUtil.format(number,PNF.E164);}console.log(replacedNumbers);// =>["+81311112222","+81311112222","+81311112222","+81312345678","+81312345678","+81312345678","+81312345678","+819012345678","+819012345678","+819012345678","+819012345678","+81120123123"]
その他の使い方
READMEをそのままのっけています。
バリデーションも出来そうです。
// Require `PhoneNumberFormat`.constPNF=require('google-libphonenumber').PhoneNumberFormat;// Get an instance of `PhoneNumberUtil`.constphoneUtil=require('google-libphonenumber').PhoneNumberUtil.getInstance();// Parse number with country code and keep raw input.constnumber=phoneUtil.parseAndKeepRawInput('202-456-1414','US');// Print the phone's country code.console.log(number.getCountryCode());// => 1// Print the phone's national number.console.log(number.getNationalNumber());// => 2024561414// Print the phone's extension.console.log(number.getExtension());// =>// Print the phone's extension when compared to i18n.phonenumbers.CountryCodeSource.console.log(number.getCountryCodeSource());// => FROM_DEFAULT_COUNTRY// Print the phone's italian leading zero.console.log(number.getItalianLeadingZero());// => false// Print the phone's raw input.console.log(number.getRawInput());// => 202-456-1414// Result from isPossibleNumber().console.log(phoneUtil.isPossibleNumber(number));// => true// Result from isValidNumber().console.log(phoneUtil.isValidNumber(number));// => true// Result from isValidNumberForRegion().console.log(phoneUtil.isValidNumberForRegion(number,'US'));// => true// Result from getRegionCodeForNumber().console.log(phoneUtil.getRegionCodeForNumber(number));// => US// Result from getNumberType() when compared to i18n.phonenumbers.PhoneNumberType.console.log(phoneUtil.getNumberType(number));// => FIXED_LINE_OR_MOBILE// Format number in the E164 format.console.log(phoneUtil.format(number,PNF.E164));// => +12024561414// Format number in the original format.console.log(phoneUtil.formatInOriginalFormat(number,'US'));// => (202) 456-1414// Format number in the national format.console.log(phoneUtil.format(number,PNF.NATIONAL));// => (202) 456-1414// Format number in the international format.console.log(phoneUtil.format(number,PNF.INTERNATIONAL));// => +1 202-456-1414// Format number in the out-of-country format from US.console.log(phoneUtil.formatOutOfCountryCallingNumber(number,'US'));// => 1 (202) 456-1414// Format number in the out-of-country format from CH.console.log(phoneUtil.formatOutOfCountryCallingNumber(number,'CH'));// => 00 1 202-456-1414
(おまけ)ライブラリを使わないでやってみた
最初はgoogle-libphonenumberを知らなかったので、正規表現でやってみました。
constphoneNumbers=['03―1111―2222','03 1111 2222','(03)1111-2222','0312345678','03 1234 5678','03-1234-5678','(03)-1234-5678','09012345678','090-1234-5678','09012345678','090―1234―5678','0120-123-123']constreplacedNumbers=phoneNumbers.map(phoneNumber=>{constreplacedNumber=toE164Number(phoneNumber);returnreplacedNumber;})functiontoE164Number(strVal){// 半角変換consthalfVal=strVal.replace(/[!-~]/g,function(tmpStr){// 文字コードをシフトreturnString.fromCharCode(tmpStr.charCodeAt(0)-0xFEE0);});console.log("halfVal",halfVal);// 文字の変換constnumber=phoneUtil.parseAndKeepRawInput(halfVal,'JP');console.log(number)console.log(phoneUtil.format(number,PNF.E164));returnhalfVal.replace(/[\-\s+()-―]/gi,'').replace('0','+81');}
最後に
google-libphonenumberはかなり便利だなと思いました。
ただ電話番号を変換するときにJPなどの国コードを指定しないといけないので、素の電話番号形式から国コードを判定するものがあればいいんですけどね。。