電話番号 編集/検証ツール( TelephoneCheck ) ヘルプ

【 はじめに 】

--- 電話番号 編集/検証 ツール [ TelephoneCheck ] について ---

この TelephoneCheck ツール は、日本の電話番号について、
( a ) 電話番号の妥当性チェック ( 局番の割り当て有無, 電話番号の長さ ) を行なう。
( b ) 局番に応じた 区切り編集を施す。
( c ) 区切り編集された電話番号の 「区切り位置」 等の チェック を行なう。
という機能を提供します。 番号翻訳テーブル という 形態の 局番収録データ により、日本全国
の 市外局番＋市内局番 を正しく反映した 区切り編集 が可能です。

現在、電話番号の 「チェック および 区切り編集」 で広く使われている手法は主に下記の １＆２ ですが、
このTelephoneCheck ツールは、それとは全く異なる第３の手法を採用しています。
--- ( 1 ) テーブル検索 ---
( a ) 全ての局番データを単純にテーブル化する
「局番（６桁, '0'+市外局番+市内局番）＋市外局番桁数」というセットで全ての局番のデータを
テーブル内に収録してあれば、電話番号の上６桁固定でテーブル検索を１回すれば事足ります。
局番テーブルを用意する側でも、市外局番を調べる側でも共に単純な作業/処理で片付きます。
問題は局番テーブルのデータ数が２万４千件程になるということでしょう。バックボーンにしっかり
としたデータベースを備えているならば可能ですが、JavaScript だけで対応しようとするには荷が
重いでしょう。
( b ) 市外局番だけでテーブル化する
市外局番だけであれば３８０件程ですので、ソースコード内に収録する事も可能でしょう。ただし、
単純に市外局番のリストを並べただけでは正しく検索する事はできません。
市外局番のリストを桁数( 2, 3, 4, 5 桁)ごとにテーブル分割して収録し、５ ⇒ 4 ⇒ ３ ⇒ ２ 桁の
順で[前方一致検索] を繰り返し試すという手順で該当する市外局番を探し出します。
但し、下記の例のように「同じ数字の並び」であっても、市内局番の割り当て方によって市外局番
が異なる（即ち、市外局番の桁数が異なる）という地域が数多く存在します。その為、「市外局番だけ」
というテーブルデータでは１００％正しい結果を得ることはできません。
[ 09934xxxxx ] ⇒ 0993-40-FGHJ , 0993-41-FGHJ , 099-343-FGHJ
099-345-FGHJ , 099-347-FGHJ , 0993-49-FGHJ
「上記のような地域のみ市内局番まで含める」というような何らかの配慮が必要になります。

--- ( 2 ) 正規表現の利用 ---
「正規表現」 を駆使して局番の判定＆電話番号の分割を行なう というものです。 しかし、電話番号
には地域 ( 局番 ) によって区切り位置 ( 市外局番-市内局番 ) が様々である為、正規表現で完璧
に仕上げようとするのは非常に困難です。
近辺の地域限定ならいざ知らず、日本全国全ての地域 ( 局番 ) を完璧にカバーする定義を自力で
作り上げるのは無理を通り越して無謀と言っても良いでしょう。幸いにして、フリーで利用できるツールが
公開されていますので、それを利用することをお薦めします。
( a ) Google 製の libphonenumber ライブラリ
電話番号編集ツールとしてはもっとも有名なものでしょう。日本全国のみならず世界中の電話番号を
網羅しています。勿論、上記の [ 09934xxxxx ] のような地域も完璧にフォローされています。
libphonenumber ライブラリ で使われている正規表現を見てみると非常に複雑で細かい記述となって
いるのが見て取れます。
( 下記 GitHub の metadata.js , 日本の定義は 3815行目～ ( 2019/4/30 現在) , [ 日本部分の抜粋 ] )
https://github.com/googlei18n/libphonenumber/
tree/master/javascript/i18n/phonenumbers
( libphonenumber デモツール : 外部サイト , Country には JP , locale は省略 )
( b ) Cleave.js 等
Cleave.js 等、他にも幾つか電話番号の フォーマット を行なえる製品があります。但し、それらも中で
libphonenumber ライブラリ を利用していますので、正規表現ツールとしては libphonenumber 一択
と言えるでしょう。

--- ( 3 ) AddinBox製 TelephoneCheck ツール が採用している『電話番号翻訳』 ---
この TelephoneCheck ツール は、今までの 「テーブル検索/正規表現 を駆使する」 という手法とは
全く異なり、「電話番号翻訳テーブル という 局番 データ を使って 電話番号翻訳を行なう」 という
アプローチ で電話番号 の フォーマット を行ないます。
尚、電話番号翻訳という手法は、電話交換機が電話番号から通話路を決定するルーティング処理で
使っている手法です。それ故に非常に高速に処理できるという特徴を持っています。
後述しますが、電話番号翻訳テーブルは「リンクチェーンテーブル」の構造をしており、電話番号の各桁
の数字を基にリンクチェーンを辿ります。殆どの電話番号では上３桁（"0"の次から)迄で完了できるでしょう。
つまり、テーブル内の３要素にアクセスするだけで完了します（１要素ごとにテーブル内を探し回るような
ことはなく、リンクチェーンによるダイレクトアクセスとなります）。この仕組みは後述の「番号翻訳シュミレータ」
で実感できるでしょう（上記の [ 09934xxxxx ] 地域を試してみると良いですよ）。

「大量のテーブルデータの中を探し回る『テーブル検索』手法」や「重い解釈エンジンを通す『正規表現』
手法」と比べて処理の負担が小さい軽量高速な手法といえます。ちなみに、番号翻訳テーブルのデータ数
は携帯電話等を含めても１４０件弱で済んでいますので、ソースコード内にそのまま収録しても邪魔になり
ません（実際にソースコードを確認してみてください）。

この TelephoneCheck ツールは、元々Excel アドイン 「kt電話郵便アドイン」 の [ ktTelEdit 関数 ] に実装して
きた機能です( 2004年10月 リリース ) 。

それを JavaScript ＆ JSON (番号翻訳テーブル) という スタイルで JavaScript ツール として移植しました。
( TeleponeCheck_withJSON.js )

その後、JSON (番号翻訳テーブル) の内容 を 必要最小限 に 縮小加工 して ソースコード 内に収録した派生
バージョン を作成しました ( TelephoneCheck.js )。

この TelephoneCheck ツールでは FormatTelephone 他 幾つかの関数を提供していますが、通常の使用
では PhoneNumber 関数ひとつで充分です。

更に、派生バージョン を基にして 他の言語 への移植版 も リリース しています。
2019年4月 現在 … JAVA , PHP , Perl , Python , Ruby , VBA/VB6 , VB.net

[ AddinBox ] http://addinbox.sakura.ne.jp/
[ Tips29: JavaScript で電話番号（局番）の検証/編集 ] http://addinbox.sakura.ne.jp/Excel_Tips29.htm

K.Tsunoda(AddinBox) Mail:addinbox@h4.dion.ne.jp CopyRight(C) 2019 Allrights Reserved.


【 固定電話の電話番号について 】

固定電話番号 ( NTT ) の様式は以下のように、計 １０ 桁の番号として定義されています。
昔は 「東京・大阪および一部地域で ９ 桁」 や 「市内局番なし（０＋市外局番 ５ 桁＋加入者番号 ４ 桁」
といった地域もありましたが、現在は全国で下記様式の 『 １０ 桁 』 に統一されています。

全国の 「市外局番＋市内局番」 データは下記の総務省HP に Excel ファイル として公開されており、
毎月初に最新データ で更新されています。
http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html

上図 １～９ の ファイル合計で 約 7,000KB ( 約 43,000 件 ) の データサイズ があります。

私の公開ソフト ( kt電話郵便アドイン ) では、この データ を基にして電話番号の ハイフン編集を行なう
ktTelEdit 関数を提供しています。ただし、上記のような 7,000 KB もの変換用データ を実装している訳
ではありません。ktTelEdit 関数の為に組み込んである データ は僅か 「３６ KB ( xls ファイル 換算 ) 」
です。 Excel データ として 「１２５ 行×１０ 列」 程度になります。

kt電話郵便アドイン では、全国の局番データ ( 市外局番＋市内局番 ) を、電話交換機　などで使われて
いる 【 番号翻訳テーブル ( 傘型構造) 】 という形態 ( 下図イメージ , 傘 １つ が １行分 の データ ) に
加工して収録しており、更に最適化処理も施すことにより前述の コンパクト な サイズ を実現しています。

番号翻訳テーブル の構造上の特性により、最大でも ５ 個目の傘型 ( 殆どは３ 個目の傘型 ) で検索を完了
します。 Next テーブル への インデックス 付きですから、"配列全体から検索" を ５ 回 という事ではなく、
単に配列要素 ( 傘型 ) に ５ 回 アクセス するだけです。

この番号翻訳テーブル による翻訳動作は
後述の 翻訳シュミレーター で確認できます。

『 傘型に ５ 回 以内の アクセス で完了』
という仕組みが実感できます。

今回、この軽量 コンパクト な 局番データ を WEB システム でも利用できるように 『 JSONデータ ( (約 ８ KB ) 』
として リリース する事にしました。


【 番号翻訳テーブル ( JSON ファイル ) の構造 】

【 番号翻訳テーブル ( JSON ファイル ) AreaCode4JSON.json 】
( この ファイル は AddinBox サイト で ダウンロード できます )

番号翻訳テーブル とは、電話交換機のルーティング等
で使われる 「電話番号 解析用のデータ 構造」 です。

AreaCode4JSON.json は固定電話の全国の局番
( 市外局番＋市内局番 ) を、この傘型構造の データ
に編集/収録した ファイルです。

併せて、携帯電話 等の局番 も収録しています。
( 「サポート している電話番号」 参照 )

JSONファイルは、JavaScript では jQuery を利用することで読み込むことができます。
（勿論、JavaScript 以外の言語でも利用可能です）

尚、JSON ファイル未使用版 ( TelephoneCheck.js ) および 多言語移植版では、この番号翻訳テーブル を
必要最小限の内容に編集して ソースコード 内に収録しています。

----- データ構造 -----
AreaCodeList._Comment.1
. .2
. :
. :
.Update : 公開日 ( YYYY-MM-DD )
.AreaCode[ 0 ].Number : 局番データ ( 文字列 )
. .Tree[ 0 ] : 展開情報 ( 数値 )
. .Tree[ 1 ]
:
. .Tree[ 9 ]

----- 凡例 ----- ( 配列の インデックス は Zero オリジン です )
_Comment : コメント
Update : 総務省ＨＰにて リリース された日付
AreaCode : 傘型レコードの配列
Number : 個々の傘型 レコード が指し示す 「局番」 の範囲
尚、「Number」 は可読性の為に記述している情報であり、
実際の番号翻訳処理 ( テーブル検索処理 ) では使用していません。
Tree : ０～９ の １０個 固定の配列。
Number の 「次の桁」 の番号に対応しています。
ゼロ : 空き番号
正数 : 継続する次の 傘型 レコード の インデックス です ( リンク 先の存在は保証済 )。
負数 : 番号翻訳 完了
[ -2 ～ -5 ] : 固定電話の市外局番の桁数決定。
符号反転した値が市外局番の桁数 ( 先頭の 0 を含む ) です。
[ -102 ～ -110 ] : 携帯電話 等の局番で決定。
符号反転して 「100 減算」 した値が、
携帯電話などを表す TelType 値です。

TelType 値 : 1: 固定電話 ( 10桁 )
2: 携帯電話 ( 070/080/090 , 11桁 )
3: 着信課金 ( 0120 , 10桁 )
4: 着信課金 ( 0800 ,11桁 )
5: ＩＰ電話 ( 050 , 11桁 )
6: Ｍ２Ｍ ( 020x , 11桁 , x≠4 )
7: ポケベル ( 0204 , 11桁 )
8: ＦＭＣ ( 0600 , 11桁 )
9: 情報料徴収 ( 0990 , 10桁 )
10: 統一番号 ( 0570 , 10桁 )

----- データ例 -----
AreaCode[0].Tree[4] ⇒ Number"0"+"4" , 40番レコード(Number"04")に継続
AreaCode[5].Tree[4] ⇒ Number"0137"+"4" , 市外局番５桁( 01374-E-FGHJ )で決定
AreaCode[5].Tree[8] ⇒ Number"0137"+"8" , 市外局番４桁( 0137-8E-FGHJ )で決定
AreaCode[2].Tree[0] ⇒ Number"012"+"0" , TelType=3 : 着信課金( 0120-DEF-GHJ )で決定

殆どの区域では局番の途中で市外局番桁数を決定できますが、
下記の 09934E-FGHJ 区域 (099-34E or 0993-4E)のように、
市内局番の最後の桁まで見ないと決定できない区域もあります。
0993-40-FGHJ
0993-41-FGHJ
099-343-FGHJ
099-345-FGHJ
099-347-FGHJ
0993-49-FGHJ

{
"AreaCodeList":{
"_Comment":{
"1":"全国市外局番 番号翻訳テーブル for Json (2019/3/1 版)",
"2":"固定電話に加えて携帯/着信課金等の局番も収録されています。",
"3":"総務省ＨＰ「電気通信番号の利用・指定」公開データより作成",
"4":"http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/",
"5":"作成：AddinBox(角田) http://addinbox.sakura.ne.jp/Excel_Tips29.htm",
"Update":"2019-03-01",
"AreaCode":[
{"Number":"0","Tree":[0,1,22,39,40,51,65,66,77,109]},
{"Number":"01","Tree":[0,-3,2,4,7,10,15,19,20,21]},
{"Number":"012","Tree":[-103,0,0,-4,-4,-4,3,0,0,0]},
{"Number":"0126","Tree":[0,0,-4,-4,-4,-4,-4,-5,0,0]},
{"Number":"013","Tree":[0,0,0,-4,-4,-4,-4,5,-4,6]},
{"Number":"0137","Tree":[0,0,-5,0,-5,-4,-4,-5,-4,0]},
{"Number":"0139","Tree":[0,0,-5,-4,-4,-4,-4,-5,-5,0]},
{"Number":"014","Tree":[0,0,-4,-4,-4,8,9,0,0,0]},
{"Number":"0145","Tree":[0,0,-4,-4,-4,0,-5,-5,0,0]},
:
:
{"Number":"099","Tree":[-109,-5,-3,120,123,-4,124,-4,-3,0]},
{"Number":"0993","Tree":[0,0,-4,121,122,-4,-4,-4,-4,0]},
{"Number":"09933","Tree":[0,-3,-4,-4,-4,-4,-4,-4,-4,-4]},
{"Number":"09934","Tree":[-4,-4,0,-3,0,-3,0,-3,0,-4]},
{"Number":"0994","Tree":[-3,0,-4,-4,-4,-4,-4,-3,-3,-4]},
{"Number":"0996","Tree":[0,0,-4,-4,-4,-4,-4,-4,-4,-5]}
{"Number":"020","Tree":[0,-106,-106,-106,-107,-106,-106,-106,-106,-106]},
{"Number":"050","Tree":[0,-105,-105,-105,-105,-105,-105,-105,-105,-105]},
{"Number":"060","Tree":[-108,0,0,0,0,0,0,0,0,0]},
{"Number":"070","Tree":[0,-102,-102,-102,-102,-102,-102,-102,-102,-102]},
{"Number":"080","Tree":[-104,-102,-102,-102,-102,-102,-102,-102,-102,-102]},
{"Number":"090","Tree":[0,-102,-102,-102,-102,-102,-102,-102,-102,-102]}
]
}
}

  ----- 番号翻訳テーブルの検索方法 ( 市外局番桁数 等の決定方法 ) by JavaScript -----
番号翻訳処理の動作は 翻訳シュミレーター で確認できます。

JSON ファイルの読み込みでは jQuery を使用します。
JavaScritソースコード 並びに サンプルツールの HTML コード も併せて参照してください。

var JsonTBL;     // JSON データの読込エリア   ← JSON未使用版での定義は JS ファイルを参照

var AreaCodeLength = 0;  // 市外局番の桁数
var cnt = 0;
var num = 0;
var LinkValue = 0;
var TelType = 0;

// JSONファイルの読込 ( jQuery を利用 )
$.ajaxSetup({async: false});
var jqXHR = $.getJSON(JSONファイルのパス, function() {
});
$.ajaxSetup({async: true});
jqXHR.done(function(JsonTBL) {

// 番号翻訳テーブルから局番情報(市外局番の桁数 or [携帯番号 等]のType情報)を取得する。
// [電話番号] は10/11桁なので、番号翻訳テーブルの構造上、[検索継続]の状態で
// ループ終了する事は無い。
var idx = 0;
for (cnt = 1; cnt <= 5; cnt++) { // 番号翻訳テーブルはA～Eコードの５段
num = Number(電話番号.substr(cnt, 1)); // 電話番号の2桁目以降(1桁目は'0')を順次取り出す
LinkValue = JsonTBL.AreaCodeList.AreaCode[idx].Tree[num];
if (LinkValue == 0) {  // 番号翻訳 終了(固定電話 未使用局番)
TelType = 1;
AreaCodeLength = 0;
break;
} else {
if (LinkValue < 0) {  // 番号翻訳 終了
if (LinkValue > -100) {
// 固定電話の市外局番桁数(符号反転値) 実際の収録値[ -2 ～ -5 ]
TelType = 1;
AreaCodeLength = LinkValue * (-1); // 市外局番 桁数決定(先頭の "0" 含む)
} else {
// 携帯電話 等のTelType値(符号反転値 - 100) 実際の収録値[ -102 ～ -110 ]
TelType = (LinkValue * (-1)) - 100;
}
break;
} else { // プラス値
idx = LinkValue;  // 検索継続(収録値は NextIndex)
}
}
}
} );

// 以降、TelType に応じた桁区切りで編集する
// 固定電話(TelType=1)では市外局番桁数(AreaCodeLength)に従って編集する

市外局番の桁数   ⇒ AreaCodeLength ( 先頭の "0" 含む )
市内局番の桁数   ⇒ 6 - AreaCodeLength  ( = 10 - 市外局番の桁数
- 加入者番号の桁数(4) )
加入者番号の桁数 ⇒ 4 固定

(補) JSONファイル未使用版 ( 番号翻訳テーブル を ソースコード 内に収録 ) では
jQuery による JSONファイル読込処理 部分(赤字部分)が不要になります。


【 電話番号翻訳テーブル 翻訳シュミレーター 】

電話番号翻訳テーブル ( AreaCode4JSON.json ) の 翻訳動作を体験する シュミレーター　です。
電話番号の入力 ボックス に電話番号 ( ハイフン等の区切りの無い 数字のみ ) を入力すると、
１ 桁 入力する都度、翻訳されていきます。 ( テーブル値 の 意味は フォーム 下 で説明しています )

電話番号(半角数字 10 or 11桁)
⇒ ( 編集結果 )

ゼロ : 空番
プラス値 : 翻訳継続 ( Next Index )
マイナス値 : [ -2 ～ -5 ] ⇒ 固定電話 ( TelType = 1 ) ： 市外局番桁数が決定 ( 符号反転値 )
--- 以下、「符号反転 ＆ 100 減算」 で電話番号種別を示す TelType 値 ( 1 ～ 10 ) になります ---
[ -102 ] ⇒ 携帯電話(070/080/090) , [ -103 ] ⇒ 着信課金(0120) , [ -104 ] ⇒ 着信課金(0800)
[ -105 ] ⇒ ＩＰ電話(050) , [ -106 ] ⇒ Ｍ２Ｍ(020x , x≠4) , [ -107 ] ⇒ ポケベル(0204)
[ -108 ] ⇒ ＦＭＣ(0600) , [ -109 ] ⇒ 情報料代理徴収(0990) , [ -110 ] ⇒ 全国統一番号(0570)

参考：総務省/電気通信番号 指定状況


【 基本事項 】

-- 最新バージョン Ver 1.00 (番号翻訳テーブル： 2022/7/1 版) , 2022/8/2 ( 更新履歴 ) --

( a ) 電話番号翻訳 テーブル を JSON ファイルから読込み
⇒ TelephoneCheck_withJSON.js ( ベース バージョン )
( 注 ) AreaCode4JSON.json を TelephoneCheck_withJSON.js と 同じ フォルダ に保存します。

※ 毎回 JSON ファイル を読み込みますので、連続して大量の データ を処理する ケース では
処理完了までに時間が掛かります。 そのような利用形態では 「番号翻訳テーブル 内包版
TelephponeCheck.js 」 を使用 してください。

( b ) 電話番号翻訳 テーブル を ソースコード 内に収録
⇒ TelephoneCheck.js ( 派生 バージョン )

現在の番号翻訳テーブルの内容は [ 2022/7/1 版 ]です。
尚、局番の変更は、郵便番号のように毎月実施されるものではありません。
したがって、ソースコード埋め込み版による運用で今後も全く支障はありません。
2019年 3月時点では [ 086-CDE 化 , 2013年 ] を最後に以後は実施されていません。
2019/5/7 版 変更内容
[ 局番の追加 : 025-60x , 025-80x ]
2020/6/1 版 変更内容
[ 局番の追加 : 0158-3x , 0163-9x , 0539-61 , 0865-50 , 0980-6x , 0980-9x ]
[ 局番の削除 : 015-41x , 0163-7x , 0164-7x , 0278-4x , 086-365 , 086-367 , 086-998 ]
2022/7/1 版 変更内容
[ 市内局番化 : 09496-x ⇒ 0949-6x ]
[ 局番の削除 : 0256-26 , 0283-78 , 0428-98 , 086-369 ]

( c ) 他に JAVA , PHP , Perl , Python , Ruby , VBA/VB6 , VB.net に移植したバージョンもあります。

( これらの ファイル は AddinBox サイト で ダウンロード できます )

( 1 ) 以下の ５つの関数を提供しています。
( 通常の使用であればPhoneNumber 関数ひとつで十分です )

・ ValidateTelephone … ハイフン/括弧 で 編集された電話番号を検証する関数

・ FormatTelephone … 電話番号(数字のみ) を ハイフン/括弧 で編集する関数

・ GetTypeTelephone … 電話番号(数字のみ) から局番情報 ( 固定電話/携帯電話 等の種別
＆ 区切りサイズ情報 ) を取得する関数

・ InitTelephone … 返却値 ( 連想配列 ) を受け取る変数を初期化する関数

・ PhoneNumber … ValidateTelephone / FormatTelephone の簡易インターフェース 関数

( 2 ) 以下の電話番号をサポートしています( 参考：総務省/電気通信番号 指定状況 )。
・ 固定電話 [ 10桁 , 0A-BCDE-FGHJ , 0AB-CDE-FGHJ , 0ABC-DE-FGHJ , 0ABCD-E-FGHJ ]
・ 携帯電話 [ 11桁 , 0A0-CDEF-GHJK or 0A0-CDE-FGHJK , A : 7-9 ]
・ 着信課金 [ 10桁 , 0120-DEF-GHJ / 11桁 , 0800-DEF-GHJK ]
・ ＩＰ電話 [ 11桁 , 050-CDEF-GHJK , C : 1-9 ]
・ M2M [ 11桁 , 020-CDE-FGHJK , C : 1-3/5-9 ]
・ ポケベル [ 11桁 , 020-4DE-FGHJK ]
・ FMC サービス [ 11桁 , 0600-DEF-GHJK ]
・ 情報料代理徴収 [ 10桁 , 0990-DEF-GHJ ] ( 災害募金サービス )
・ 全国統一番号 [ 10桁 , 0570-DEF-GHJ ] ( NTT ナビダイヤル 等 )

( 3 ) 局番 に関する注意事項
( a ) 固定電話については、番号翻訳テーブル により　全国の局番( 市外局番 + 市内局番 ) を
忠実に反映した 区切り位置 ( 市外局番 と 市内局番 の 桁数 ) で編集されます。

( b ) 市外局番 の 番号割当判定については、全国の市外局番を忠実に反映し、未割当の番号には
必ず [ ErrId : 未使用局番 ] が返ります。

( c ) 市内局番 の 番号割当判定については、番号翻訳テーブル上で 市外局番の 決定に必要な
桁位置の状況に拠ります。 市内局番の途中で決定すれば、それ以降の桁の番号はフリーですが、
市内局番の１桁目が [ 0 or 1 ] の場合には [ ErrId : 市内局番 1桁目が [ 0 or 1 ] ] が返ります。
実際の番号域での 判定状況は 番号翻訳 シュミレータ で確認して下さい。

( d ) 携帯電話 [ 060 ] は運用開始が未定な為、サポートしていません。


【 ValidateTelephone 】

ハイフン/括弧 で 編集されている固定電話/携帯電話などの
番号編集パターンの正確性を検証する関数です。

-- 構 文 --
ValidateTelephone ( TelCode )
( Python / Ruby 版では validate_telephone )

返却値 ： 連想配列 型 ( JAVA 版では クラスオブジェクト ,
VBA/VB6 版では ユーザー定義型 ( Type ) , VB.net 版では 構造体 ( Structure ) )
TelCode : 文字列 型

-- 引数内容 --
[ TelCode ]
ハイフン/括弧 で 編集されている固定電話/携帯電話などの電話番号を指定します。
編集パターンは下記の３種類です。
0AB-CDE-FGHJ , 0AB(CDE)FGHJ , (0AB)CDE-FGHJ

編集されていない電話番号(数字のみ)を指定しても構いません。
この場合は 0AB-CDE-FGHJ のパターンで編集した結果を受け取れます。

-- 返却値 --
{ TelType, EditType, TelEdit, ErrId } の連想配列を返します。
以下のように使用します。 ( サンプルツール の ソースコード に具体例があります )
      var Result = InitTelephone("Value");
      Result = ValidateTelephone( … );
      // var Result = ValidateTelephone( … );  ←変数定義と共に関数結果を受け取る例

      if (Result.ErrId == 0) {
          xxx = Result.TelEdit;

TelType : 数値 ( 電話番号の種類に応じて下記の値が設定されます )
1: 固定電話 ( 10桁 ) , 2: 携帯電話 ( 070/080/090 , 11桁 ) , 3: 着信課金 ( 0120 , 10桁 )
4: 着信課金 ( 0800 , 11桁 ) , 5: IP電話 ( 050 , 11桁 ) , 6: M2M ( 020x , 11桁 , x≠4 )
7: ポケベル ( 0204 , 11桁 ) , 8: FMC ( 0600 , 11桁 ) , 9: 情報料徴収 ( 0990 , 10桁 )
10: 統一番号 ( 0570 , 10桁 ) , -1: other ( 内容不正時 )

EditType : 数値 ( 編集パターンに応じた下記の値が設定されます)
1 or 4 : 0AB-CDE-FGHJ
2 or 5 : 0AB(CDE)FGHJ
3 or 6 : (0AB)CDE-FGHJ
9: other ( 内容不正時 )
( 携帯電話のみ、[ 3-4-4 桁 ]で区切る ⇒ 1～3 , [ 3-3-5 桁 ]で区切る ⇒ 4～6 )

TelEdit : 文字列
ErrId に応じて以下の内容が設定されます。
ErrId = 0 : OK , TelCode のまま
〃 = 1 , 3 , 5 : TelCode と 同じパターンで編集し直された電話番号
〃 = 8 : OK , ハイフン編集した電話番号 ( TelCode が 数字のみ )
〃 = 2 : TelCode のまま ( 未使用局番なので正誤は判断しない )
〃 = 4 , 6 , 9 : 空文字

ErrId : 数値 ( 検証結果 が下記の値で設定されます)
0 : OK , 正しい電話番号編集( 有効な局番 ＆ 桁数 OK ＆ 区切り位置も正しい )
1 : 区切り位置不正
2 : 未使用局番 ( 固定電話 )
3 : 市内局番 1桁目が [ 0 or 1 ] ( 固定電話 )
4 : 引数不正 ([数字,ハイフン,括弧]以外がある or 編集パターン不正 or '0'始まりでない or 桁数不足 )
5 : 引数不正 (局番タイプに応じた桁数と不一致)
6 : その他のエラー
8 : OK , 数字のみで指定された正しい電話番号 ( 有効な局番 ＆ 桁数 OK )
9 : 引数未定義 ( TelCode )


【 FormatTelephone 】

固定電話/携帯電話 などの 電話番号 ( 数字のみ ) を指定の編集パターンで編集する関数です。
固定電話の場合、全国の局番( 市外局番 + 市内局番 )に応じた編集が施されます。

-- 構 文 --
FormatTelephone ( TelCode , EditType )
( Python / Ruby 版では format_telephone )

返却値 ： 連想配列 型 ( JAVA 版では クラスオブジェクト ,
VBA/VB6 版では ユーザー定義型 ( Type ) , VB.net 版では 構造体 ( Structure ) )
TelCode : 文字列 型
EditType : 数値 型

-- 引数内容 --
[ TelCode ]
固定電話/携帯電話などの電話番号( '0' 始まり の 10桁以上の数字文字列 )を指定します。
ハイフン等で編集された電話番号はエラーになります。

[ EditType ]
編集パターンを下記の数値で指定します。
1 or 4 : 0AB-CDE-FGHJ
2 or 5 : 0AB(CDE)FGHJ
3 or 6 : (0AB)CDE-FGHJ
( 携帯電話のみ、[ 3-4-4 桁 ]で区切る ⇒ 1～3 , [ 3-3-5 桁 ]で区切る ⇒ 4～6 )

-- 返却値 --
{ TelType, EditType, TelEdit, ErrId } の連想配列を返します。

以下のように使用します。 ( サンプルツール の ソースコード に具体例があります )
      var Result = InitTelephone("Value");
      Result = FormatTelephone( … );
      // var Result = FormatTelephone( … );  ←変数定義と共に関数結果を受け取る例

      if (Result.ErrId == 0) {
          xxx = Result.TelEdit;

TelType : 数値 ( 電話番号の種類に応じて下記の値が設定されます )
1: 固定電話 ( 10桁 ) , 2: 携帯電話 ( 070/080/090 , 11桁 ) , 3: 着信課金 ( 0120 , 10桁 )
4: 着信課金 ( 0800 , 11桁 ) , 5: IP電話 ( 050 , 11桁 ) , 6: M2M ( 020x , 11桁 , x≠4 )
7: ポケベル ( 0204 , 11桁 ) , 8: FMC ( 0600 , 11桁 ) , 9: 情報料徴収 ( 0990 , 10桁 )
10: 統一番号 ( 0570 , 10桁 ) , -1: other ( 内容不正時 )

EditType : 数値 ( 引数で指定した値が設定されます )
1 or 4 : 0AB-CDE-FGHJ
2 or 5 : 0AB(CDE)FGHJ
3 or 6 : (0AB)CDE-FGHJ
9: other ( 内容不正時 )
( 携帯電話のみ、[ 3-4-4 桁 ]で区切る ⇒ 1～3 , [ 3-3-5 桁 ]で区切る ⇒ 4～6 )

TelEdit : 文字列
ErrId に応じて以下の内容が設定されます。
ErrId = 0 : OK ,引数( EditType ) に応じて編集された電話番号が設定されます。
〃 = 1 : TelCode のまま ( 未使用局番なので編集しません )
〃 = 2 , 4 : 引数( EditType ) に応じて編集された電話番号が設定されます。
〃 = 3 , 6 , 9 : 空文字

ErrId : 数値 ( 下記の値で設定されます)
0 : OK
1 : 未使用局番 (固定電話)
2 : 市内局番 1桁目が [ 0 or 1 ] (固定電話)
3 : 引数不正 ( TelCode : [ '0' 始まりの数字 ] 以外 or 10桁未満 )
4 : 引数不正 ( TelCode : 局番タイプに応じた桁数と不一致 )
6 : 引数不正 ( EditType )
9 : 引数未定義 ( TelCode/EditType )

( 補 足 )
電話番号を 市外局番 , 市内局番 , 加入者番号 に分割 したい場合は、
ハイフン ( EditType = 1 ) で編集した結果を Split 関数で分割します。

          var Result = InitTelephone("Value");
          Result = FormatTelephone( 電話番号 , 1 );
          if (Result.ErrId == 0) {
              var TelSplit = Result.TelEdit.Split("-");

              TelSplit[ 0 ]  ⇒  市外局番
              TelSplit[ 1 ]  ⇒  市内局番
              TelSplit[ 2 ]  ⇒  加入者番号


【 GetTypeTelephone 】

固定電話/携帯電話などの電話番号( 数字のみ ) から 局番情報 ( 局番タイプ ＆ 桁数 ＆
区切り位置 ) を取得する関数です。

固定電話の場合、全国の局番( 市外局番 + 市内局番 )に応じた情報が取得できます。

-- 構 文 --
GetTypeTelephone ( TelCode )
( Python / Ruby 版では get_type_telephone )

返却値 ： 連想配列 型 ( JAVA 版では クラスオブジェクト ,
VBA/VB6 版では ユーザー定義型 ( Type ) , VB.net 版では 構造体 ( Structure ) )
TelCode : 文字列 型

-- 引数内容 --
[ TelCode ]
固定電話/携帯電話などの電話番号( '0' 始まり の 数字文字列 ) を指定します。
局番を決定できる桁数であれば 10/11桁未満でも構いません。
ハイフン等で編集された電話番号はエラーになります。

-- 返却値 --
{ TelType, SizeAll, Size1, Size2, Size3 } の連想配列を返します。

以下のように使用します。 ( サンプルツール の ソースコード に具体例があります )
      var Result = InitTelephone("Type");
      Result = GetTypeTelephone( … );
      // var Result = GetTypeTelephone( … );  ←変数定義と共に関数結果を受け取る例

      if (Result.ErrId == 0) {
          xxx = Result.SizeAll;

TelType : 数値 ( 電話番号の種類に応じて下記の値が設定されます )
1: 固定電話 ( 10桁 ) , 2: 携帯電話 ( 070/080/090 , 11桁 ) , 3: 着信課金 ( 0120 , 10桁 )
4: 着信課金 ( 0800 , 11桁 ) , 5: IP電話 ( 050 , 11桁 ) , 6: M2M ( 020x , 11桁 , x≠4 )
7: ポケベル ( 0204 , 11桁 ) , 8: FMC ( 0600 , 11桁 ) , 9: 情報料徴収 ( 0990 , 10桁 )
10: 統一番号 ( 0570 , 10桁 ) , -1: other ( 内容不正時 )

SizeAll : 数値
ErrId に応じて以下の内容が設定されます。
ErrId = 0 , 2 : TelType に応じた電話番号の桁数 ( 10 or 11 , Size1～3 の合計値 )
上記以外 : 0

Size1 ～ 3 : 数値
ErrId に応じて以下の内容が設定されます。
ErrId = 0 , 2 : TelType に応じた電話番号の区切り桁数 ( Size1 には先頭 '0' を含む )
上記以外 : 0

固定電話の場合、市外局番( Size1 ), 市内局番( Size2 ), 加入者番号( Size3 = 4 ) です。

ErrId : 数値 ( 下記の値で設定されます)
0 : OK
1 : 未使用局番 (固定電話)
2 : 市内局番 1桁目が [ 0 or 1 ] (固定電話)
3 : 電話番号種別が不明 ( 桁数不足で番号翻訳未了 )
8 : 引数不正 ( TelCode : [ '0' 始まりの数字 ] 以外 )
9 : 引数未定義 ( TelCode )


【 InitTelephone 】

ValidateTelephone / FormatTelephone / GetTypeTelephone の
結果 ( 連想配列 ) を受け取る変数に初期化データ を渡す関数です。

-- 構 文 --
InitTelephone ( Target )
( Python / Ruby 版では init_telephone )

返却値 ： 連想配列 型
Target : 文字列 型

-- 引数内容 --
[ Target ]
      "Value" --- VaridateTelephone / FormatTelephone
      "Type"  --- GetTypeTelephone
      上記以外 -- "Value" 扱いになります。

-- 返却値 --
Target の指定により以下の連想配列を返します。
      Target = "Value"
       { "TelType":-1, "EditType":9, "TelEdit":"", "ErrId":0 }

      Target = "Type"
       { "TelType":-1, "SizeAll":0, "Size1":0, "Size2":0, "Size3":0, "ErrId":0 }

( 補足 )
JavaScript 以外の言語では下記になります。
JAVA , VBA/VB6 , VB.net 版では返却値の構造が異なります ( 連想配列 ではありません ) 。
各言語版の 「留意事項」 を確認して下さい。

-- Perl --
( TelType => -1, EditType => 9, TelEdit => "", ErrId => 0 )
( TelType => -1, SizeAll => 0, Size1 => 0, Size2 => 0, Size3 => 0, ErrId => 0 )

-- PHP --
[ "TelType" => -1, "EditType" => 9, "TelEdit" => "", "ErrId" => 0 ]
[ "TelType" => -1, "SizeAll" => 0, "Size1" => 0, "Size2" => 0, "Size3" => 0, "ErrId" => 0 ]

-- Python --
{ 'TelType':-1, 'EditType':9, 'TelEdit':'', 'ErrId':0 }
{ 'TelType':-1, 'SizeAll':0, 'Size1':0, 'Size2':0, 'Size3':0, 'ErrId':0 }

-- Ruby --
{ TelType: -1, EditType: 9, TelEdit: '', ErrId: 0 }
{ TelType: -1, SizeAll: 0, Size1: 0, Size2: 0, Size3: 0, ErrId: 0 }


【 PhoneNumber 】

VaridateTelephone / FormatTelephone を簡易に利用する為の インターフェース 関数です。

-- 構 文 --
PhoneNumber ( TelCode , Action )
( Python / Ruby 版では phone_number )
( VB.net 版では オーバーロード 関数( Action の指定有無 )です )

返却値 : 数値 型 or 文字列 型
TelCode : 文字列 型
Action : 文字列 型

-- 引数内容 --
[ TelCode ]
固定電話/携帯電話などの電話番号( '0' 始まり の 10桁以上の数字文字列 )を指定します。
Action = "V" の場合は ハイフン/括弧で編集された電話番号。
Action = "F1"～"F6" の場合は 未編集の電話番号。

[ Action ]
処理方法を以下の値で指定します。
"V" --- ValidateTelephone による 検証
"F1"～"F6" --- FormatTelephone による ハイフン/括弧編集

"F1"～"F6" の２ 桁目が編集パターンになります。
1 or 4 : 0AB-CDE-FGHJ
2 or 5 : 0AB(CDE)FGHJ
3 or 6 : (0AB)CDE-FGHJ
( 携帯電話のみ、[ 3-4-4 桁 ]で区切る ⇒ 1～3 , [ 3-3-5 桁 ]で区切る ⇒ 4～6 )
-- VB.net 版 特記事項 ( オーバーロード関数 ) --
Action を 省略 ・・・ ValidateTelephone による 検証 ⇒ 返却値が 数値
Action に 数値の 1 ～ 6 を指定 ・・・ FormatTelephone による ハイフン/括弧編集 ⇒ 返却値が 文字列

-- 返却値 --
Action = "V" の場合
0: 検証エラー , 1 : 検証OK , 2 : 検証OK ( 電話番号が数字のみ )
( JavaScript 等では、Boolean 変換すると 0 ⇒ False , 1/2 ⇒ True になります )
-- Ruby 版 特記事項 --
Ruby では [ 数値の 0 ] が True と扱われる為、[ 0 ] の 代わりに [ False ] を返します。
--JAVA 版 特記事項 --
数値の [ 0 , 1 , 2 ] の 代わりに 文字列の [ "0" . "1" , "2" ] を返します。

Action = "F1"～"F6" の場合
電話番号が正しい場合 : [ Action 2桁目 ] に従って編集した電話番号
電話番号が誤っている場合 : "Phone Error"

Action が上記以外 の場合
空文字が返ります 。

-- 使用方法 --

    if (Boolean(PhoneNumber( 編集電話番号 , "V" )) {
        // 検証ＯＫ ( 1 or 2 )
    } else {
        // 検証ＮＧ ( 0 )
    }

    switch (PhoneNumber( 編集電話番号 , "V" ) {
        case 0:    // 検証ＮＧ
        case 1:    // 検証ＯＫ
        case 2:    // 未編集の正しい電話番号
    }

    window.alert(PhoneNumber( 編集電話番号 , "F1" ));


【 TelephoneCheck デモツール 】

---- 電話番号の 編集 ＆ 検証 ツール ( by TelephoneCheck.js ) ----
JavaScript 版 による TelephoneCheck の デモツール です。

---------- PhoneNumber ( ValidateTelephone / FormatTelephone の簡易インターフェース ) ------
電話番号(半角) [ 電話番号,F1～F6 or 編集電話番号,V ]
⇒
( String(Boolean(Result)) + " [ " + String(Result) + " ]" )

---------- FormatTelepone による電話番号の編集 ----------

電話番号( 10 or 11桁 ) を入力して 編集ボタン をクリックする。
編集タイプ 1 or 4: 012-345-6789 , 2 or 5: 012(345)6789 , 3 or 6: (012)345-6789
( 携帯電話のみ [3-4-4 桁]で区切る⇒1～3, [3-3-5 桁]で区切る⇒4～6 )

( 編集結果 )

---------- ValidateTelepone による電話番号の検証 ----------

ハイフン/括弧で編集された電話番号を入力して 検証ボタン をクリックする。
数字のみ(ハイフン/括弧編集なし)を指定した場合は「ハイフン編集」のみ行います。
( 携帯電話では [3-4-4 桁] [3-3-5 桁]区切り の両方可 )

( 検証結果 )

---------- GetTypeTelepone による電話番号の[種別＆区切り桁]取得 ----------

桁数オーバーはエラーにしません。呼び出し側で[SizeAll]と比較して判定してください。
携帯電話は[3-4-4桁]固定です。[3-3-5桁]は呼び出し側で[TelType = 2]を判断して設定
してください。１桁入力する都度 結果が更新されます。
電話番号( 半角数字 10 or 11桁 )
( 結果 )
ErrId 0:OK , 1:未使用局番(固定電話) , 2:市内局番1桁目が[0 or 1](固定電話)
3:電話番号種別が不明(桁数不足で番号翻訳未了)
8:引数不正(TelCode: ['0'始まりの数字]以外) , 9:引数未定義(TelCode)

【 サポートしている電話番号 ( カッコ内は TelType値 ) 】
( 1 ) 固定電話 10桁 [ 0ABCDE-FGHJ   ] ( 6 ) Ｍ２Ｍ 11桁 [ 020-CDE-FGHJK ]
( 2 ) 携帯電話 11桁 [ 0A0-CDEF-GHJK ] ( 7 ) ポケベル 11桁 [ 020-4DE-FGHJK ]
( 3 ) 着信課金 10桁 [ 0120-DEF-GHJ  ] ( 8 ) ＦＭＣ 11桁 [ 0600-DEF-GHJK ]
( 4 ) 着信課金 11桁 [ 0800-DEF-GHJK ] ( 9 ) 情報料代理徴収 10桁 [ 0990-DEF-GHJ ]
( 5 ) ＩＰ電話 11桁 [ 050-CDEF-GHJK ] ( 10 ) 全国統一番号 10桁 [ 0570-DEF-GHJ ]
[ 携帯電話 A:7-9, C:1-9 ] [ ＩＰ電話 C:1-9 ] [ Ｍ２Ｍ C:1-3,5-9 ]

---- TelephoneCheck.js のテストツール ( この下に結果が表示されます ) ----

電話番号(半角数字)


【 ValidateTelephone 利用例 】

--- jQuery ライブラリ ファイル の指定  ---
CDN もしくは ローカル に保存した jQuery ライブラリファイル の パス を指定します。

-- CDN から読み込む例 --
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"
charset="UTF-8"></script>

-- ローカル に保存した ライブラリファイル を読み込む例 --
<script src="JS/jquery-1.12.4.min.js" charset="UTF-8"></script>

jQuery ライブラリ は TelephoneCheck_withJSON.js を使用する場合に必須です。
( JSON ファイルの読み込みに使っています )
TelephoneCheck.js を使用する場合には不要です。

--- JavaScript ファイル の指定 ( この例では JS フォルダ内に置いています )
---

<script src="JS/TelephoneCheck_withJSON.js"></script>
( 注 ) AreaCode4JSON.json を 同じフォルダに置いてください。
尚、HTML コード上で JSON ファイルの パス を指定する必要はありません。
または
<script src="JS/TelephoneCheck.js"></script>
( 注 ) ソースコード内に番号翻訳テーブルを収録しているので JSON ファイルは不要です

--- 利用コード --- ( <HEAD> ブロック内に記述します )

<script LANGUAGE="JavaScript">
<!--
// 電話番号の検証 ( VaridateTelephone )
function Sample2() {
if (Form2.TextBox3.value == "") {
Form2.TextBox4.value = "";
return;
}

var Result = ValidateTelephone(Form2.TextBox3.value);
switch (Result.ErrId) {
case 0:
Form2.TextBox4.value = "正しい電話番号＆編集です";
break;
case 8:
Form2.TextBox4.value = "正しい電話番号＆数字のみ指定
⇒ " + Result.TelEdit;
break;
case 1:
Form2.TextBox4.value = "区切り位置が不正。正⇒ "
+ Result.TelEdit;
break;
case 2:
Form2.TextBox4.value = "未使用の局番です";
break;
case 3:
Form2.TextBox4.value = "市内局番1桁目が 0/1 は
NG, " + Result.TelEdit;
break;
case 4:
Form2.TextBox4.value
= "[数字,ハイフン,括弧]以外がある or
編集パターン不正 or '0'始まりでない";
break;
case 5:
case 6:
Form2.TextBox4.value = "その他のエラー(桁数エラー等)";
break;
case 9:
Form2.TextBox4.value = "引数が未定義";
}
}

// 結果フィールドクリア
function ClearText(obj) {
obj.value = "";
}

-->
</script>

--- 利用ツール の入力フォーム定義 --- ( <BODY> ブロック内に記述します )

<FORM name="Form2">
<INPUT size="30" type="text" name="TextBox3"
style="ime-mode:disabled;"
onChange="ClearText(Form2.TextBox4);">
<INPUT type="button" name="Button2"
value="⇒ 編集電話番号の 検証 ⇒"
onclick="Sample2();"><br>
( 検証結果 ) &nbsp;<input size="80" type="text"
name="TextBox4"><br>
</FORM>


【 FormatTelephone 利用例 】

--- jQuery ライブラリ ファイル の指定  ---
CDN もしくは ローカル に保存した jQuery ライブラリファイル の パス を指定します。

-- CDN から読み込む例 --
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"
charset="UTF-8"></script>

-- ローカル に保存した ライブラリファイル を読み込む例 --
<script src="JS/jquery-1.12.4.min.js" charset="UTF-8"></script>

jQuery ライブラリ は TelephoneCheck_withJSON.js を使用する場合に必須です。
( JSON ファイルの読み込みに使っています )
TelephoneCheck.js を使用する場合には不要です。

--- JavaScript ファイル の指定 ( この例では JS フォルダ内に置いています )
---

<script src="JS/TelephoneCheck_withJSON.js"></script>
( 注 ) AreaCode4JSON.json を 同じフォルダに置いてください。
尚、HTML コード上で JSON ファイルの パス を指定する必要はありません。
または
<script src="JS/TelephoneCheck.js"></script>
( 注 ) ソースコード内に番号翻訳テーブルを収録しているので JSON ファイルは不要です

--- 利用コード --- ( <HEAD> ブロック内に記述します )

<script LANGUAGE="JavaScript">
<!--
// 電話番号の編集 ( FormatTelephone )
function Sample1() {
if (Form1.TextBox1.value == "") {
Form1.TextBox2.value = "";
return;
}

var Result = FormatTelephone(Form1.TextBox1.value , eval(Form1.SelectBox1.value));
switch (Result.ErrId) {
case 0: // OK
Form1.TextBox2.value = Result.TelEdit;
break;
case 1:
Form1.TextBox2.value = Result.TelEdit + "
      (未使用の局番です)";
break;
case 2:
Form1.TextBox2.value = Result.TelEdit + "
      (市内局番1桁目が 0/1 は NG)";
break;
case 3:
case 4:
Form1.TextBox2.value = Result.TelEdit
+ " (電話番号が
['0'始まりの数字]以外 or 桁数エラー)";
break;
case 5:
Form1.TextBox2.value = Result.TelEdit + "
      (編集タイプ不正)";
break;
case 9:
Form1.TextBox2.value = Result.TelEdit + "
      (引数が未定義)";
}
}

// 結果フィールドクリア
function ClearText(obj) {
obj.value = "";
}

-->
</script>

--- 利用ツール の入力フォーム定義 --- ( <BODY> ブロック内に記述します )

<FORM name="Form1">
<INPUT size="30" type="text" name="TextBox1"
style="ime-mode:disabled;"
onChange="ClearText(Form1.TextBox2);">
<SELECT size="1" name="SelectBox1">
<option value="1"> 1 </option>
<option value="2"> 2 </option>
<option value="3"> 3 </option>
<option value="4"> 4 </option>
<option value="5"> 5 </option>
<option value="6"> 6 </option>
</SELECT>
<INPUT type="button" name="Button1"
value="電話番号ハイフン編集" onclick="Sample1();"><br>
( 編集結果 ) <INPUT size="80" type="text" name="TextBox2"><br>
</FORM>


【 GetTypeTelephone 利用例 】

--- jQuery ライブラリ ファイル の指定  ---
CDN もしくは ローカル に保存した jQuery ライブラリファイル の パス を指定します。

-- CDN から読み込む例 --
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"
charset="UTF-8"></script>

-- ローカル に保存した ライブラリファイル を読み込む例 --
<script src="JS/jquery-1.12.4.min.js" charset="UTF-8"></script>

jQuery ライブラリ は TelephoneCheck_withJSON.js を使用する場合に必須です。
( JSON ファイルの読み込みに使っています )
TelephoneCheck.js を使用する場合には不要です。

尚、この GetTypeTelephone の サンプルツール では KeyUp イベント の検知にライブラリ を
使用していますので指定してください。

--- JavaScript ファイル の指定 ( この例では JS フォルダ内に置いています ) ---

<script src="JS/TelephoneCheck_withJSON.js"></script>
( 注 ) AreaCode4JSON.json を 同じフォルダに置いてください。
尚、HTML コード上で JSON ファイルの パス を指定する必要はありません。
または
<script src="JS/TelephoneCheck.js"></script>
( 注 ) ソースコード内に番号翻訳テーブルを収録しているので JSON ファイルは不要です

--- 利用コード --- ( <HEAD> ブロック内に記述します )

<script LANGUAGE="JavaScript">
<!--
// 電話番号の種別＆区切り位置取得 ( GetTypeTelephone )
// jQuery による keyup()でキーを入力するたびにイベント発生
$(function() {
// GetTypeTelephone の返却値
var Result = InitTelephone("Type");

var strTel= "";
var EditTel = "";
var EditCode1 = "";
var EditCode2 = "";
var EditCode3 = "";
var SizeOver = "";

$('#CheckCode').keyup(function() {
var TelVal = $(this).val();
Result = GetTypeTelephone(TelVal);
if (Result.ErrId == 0 || Result.ErrId
      == 2) {
if (TelVal.length >
      Result.SizeAll) {
strTel =
      TelVal;
SizeOver
      = " , 桁数オーバー";
} else {
strTel =
      (TelVal + "xxxxxxxxxx").substr(0, Result.SizeAll);
SizeOver
      = "";
}
EditCode1 = strTel.substr(0,
      Result.Size1);
EditCode2 = strTel.substr(Result.Size1,
      Result.Size2);
EditCode3 = strTel.substr(Result.Size1
      + Result.Size2);
EditTel = EditCode1 + "-"
      + EditCode2 + "-" + EditCode3;
} else {
EditTel = TelVal;
SizeOver = "";
}
$('#CheckResult').val("ErrId= " + Result.ErrId +
" , TelType= " + Result.TelType
      +
" , Size= " + Result.SizeAll
      +
" ( " + Result.Size1 +
"-" + Result.Size2 +
"-" + Result.Size3 + "
      桁 )" +
" ⇒ [ " + EditTel + "
      ]" + SizeOver);
});
});

-->
</script>

--- 利用ツール の入力フォーム定義 --- ( <BODY> ブロック内に記述します )

<FORM name="Form3">
<input size="20" type="text" id="CheckCode"> ( 1桁入力する都度 結果が更新されます )<br>
( 結果 ) <input size="90" type="text" id="CheckResult" style="ime-mode:disabled;"><br>
</FORM>


【 PhoneNumber 利用例 】

--- JavaScript ファイル の指定 ( この例では JS フォルダ内に置いています ) ---

<script src="JS/TelephoneCheck_withJSON.js"></script>
( 注 ) AreaCode4JSON.json を 同じフォルダに置いてください。
尚、HTML コード上で JSON ファイルの パス を指定する必要はありません。
または
<script src="JS/TelephoneCheck.js"></script>
( 注 ) ソースコード内に番号翻訳テーブルを収録しているので JSON ファイルは不要です

--- 利用コード --- ( <HEAD> ブロック内に記述します )

<script LANGUAGE="JavaScript">
<!--
function PhoneNumberTest() {
var TelCode = Form4.TextBox1.value;     // <--
TelCode , Action
if (TelCode === "") {
Form4.TextBox2.value = "";
return;
}

var arg = TelCode.split(",");
if (arg.length == 2) {
var Result = PhoneNumber(arg[0].trim(), arg[1].trim());
Form4.TextBox2.value = String(Boolean(Result)) + "
[ " + String(Result) + " ]";
} else {
Form4.TextBox2.value = "電話番号と [ F1～F6 or
V ] を入力";
}
}
-->
</script>

--- 利用ツール の入力フォーム定義 --- ( <BODY> ブロック内に記述します )

<FORM name="Form4">
電話番号(半角) <INPUT size="30" type="text" name="TextBox1" style="ime-mode:disabled;">
[ 電話番号,F1～F6 or 編集電話番号,V ]<br>
<INPUT type="button" name="Button3" value="PhoneNumber のテスト" onclick="PhoneNumberTest();">
⇒ <INPUT size="30" type="text" name="TextBox2"><br>
</FORM>


【 多言語 移植 について 】

-- ここで紹介する　多言語版　について --

( a ) ツールの関数名は 「全ての言語版」 で同じです。
一部言語では 「オール小文字, アンダーバー区切り」になります。
機能/使用方法も同じです。 一部、返却値の受け取り方に違いがあります。

( b ) 番号翻訳テーブル ( AreaCode4JSON.json ) の内容を直接 ソースコード内に収録 しています。
実際の定義内容は各言語のソースコードを閲覧してください。

各言語内包用の 「配列データ」 ソースコードは、JSONファイル( AreaCode4JSON.json )作成ツールで
一緒に作成しています。したがって各 「配列データ」 ソースコード の 同一性/正確性 は保障します。

現在の番号翻訳テーブルの内容は [ 2022/7/1 版 ]です。
尚、局番の変更は、郵便番号のように毎月実施されるものではありません。
したがって、ソースコード埋め込み版による運用で今後も全く支障はありません。
2019年 3月時点では [ 086-CDE 化 , 2013年 ] を最後に以後は実施されていません。
2019/5/7 版 変更内容
[ 局番の追加 : 025-60x , 025-80x ]
2020/6/1 版 変更内容
[ 局番の追加 : 0158-3x , 0163-9x , 0539-61 , 0865-50 , 0980-6x , 0980-9x ]
[ 局番の削除 : 015-41x , 0163-7x , 0164-7x , 0278-4x , 086-365 , 086-367 , 086-998 ]
2022/7/1 版 変更内容
[ 市内局番化 : 09496-x ⇒ 0949-6x ]
[ 局番の削除 : 0256-26 , 0283-78 , 0428-98 , 086-369 ]

( c ) 多言語 移植版 は JavaScript ( 番号翻訳テーブル 内包 ) 版 の TelephoneCheck.js を
基にして作成しています。

( d ) 引数の チェック 処理については各言語仕様の違いを考慮して以下の方式にしています。
TelCode : 先頭 '0' の数字のみの文字列 ( ValidateTelephone でも [ 数字のみ ] が 指定可 )
EditType : 1～6 の数値 ( FormatTelephone のみ )

 | < 引数 を 未指定 > | < 引数値 の 型 ( string or int ) >
JavaScript | undifined 判定で対応してエラーにする。 | 「引数の型宣言」機能が無い。 typeof 演算子で判定し所定の型に変換する。 EditType は[1文字の'1'～'6'] と正規表現比較。
JAVA | 対応無し。 呼び出し側 メソッド での コンパイルエラー 任せ。 | 引数定義で型宣言を指定する。
PHP | 引数定義でデフォルト値を指定し、 引数の妥当性チェックでエラーにする。 | PHP7 : 引数定義で int / string 型宣言が 可。 PHP5 : 〃 が 不可。 is_string/is_float/is_int 関数で判定し 所定の型に変換する。 EditType は[1文字の'1'～'6'] と正規表現比較。
Perl | defined 関数の判定で対応して エラーにする。 | 「引数の型宣言」機能が無い。 空文字('')を連結して強制的に文字列型、 1を掛けて( *1 )強制的に数値型にする。 EditType は[1文字の'1'～'6'] と正規表現比較。
Python | 引数定義でデフォルト値を指定し、 引数の妥当性チェックでエラーにする。 | 「引数の型宣言」機能が無い。 type 関数で判定し所定の型に変換する。 EditType は[1文字の'1'～'6'] と正規表現比較。
Ruby | 引数定義でデフォルト値を指定し、 引数の妥当性チェックでエラーにする。 | 「引数の型宣言」機能が無い。 is_a? メソッド で判定し所定の型に変換する。 EditType は[1文字の'1'～'6'] と正規表現比較。
その他、移植する上で 把握しておくべき ポイント ( PDF , AddinBox サイト内 ) を言語別 に 纏めてあります。 その ポイント さえ把握できていれば、上記以外の言語への移植も容易です。 A3サイズなので 印刷は[ A3⇒A4 縮小 ]。


【 JavaScript 】

( a ) 電話番号翻訳 テーブル を JSON ファイルから読込み
⇒ TelephoneCheck_withJSON.js ( ベース バージョン ) ( Ver 1.00 , 2019/4/4 ) 文字コー: shift_JIS
( 注 ) AreaCode4JSON.json を TelephoneCheck_withJSON.js と 同じ フォルダ に保存します。
尚、ファイルパス を自動認識する仕様になっていますので、スクリプト参照を記載する必要はありません。
現在の AreaCode4JSON.json の内容は 2022/7/1 版 ( 下記参照 ) です。

( b ) 電話番号翻訳 テーブル を ソースコード 内に収録 ( 2022/7/1 版 )
⇒ TelephoneCheck.js ( 派生 バージョン ) ( Ver 1.00 , 2022/8/2 ) 文字コー: shift_JIS
( 注 ) 局番の変更は滅多に実施されませんので、実際の運用では、これで 十分です。
2019年 3月時点では、[ 086-CDE 化 , 2013年 ] を最後に以後は実施されていません。
2019/5/7 版 変更内容
[ 局番の追加 : 025-60x , 025-80x ]
2020/6/1 版 変更内容
[ 局番の追加 : 0158-3x , 0163-9x , 0539-61 , 0865-50 , 0980-6x , 0980-9x ]
[ 局番の削除 : 015-41x , 0163-7x , 0164-7x , 0278-4x , 086-365 , 086-367 , 086-998 ]
2022/7/1 版 変更内容
[ 市内局番化 : 09496-x ⇒ 0949-6x ]
[ 局番の削除 : 0256-26 , 0283-78 , 0428-98 , 086-369 ]

( これらの ソースコード ファイル は AddinBox サイト で ダウンロード できます )

・ 利用上の留意点
返却値は以下の連想配列になります。
     ValidateTelephone / Formattelephone : { TelType, EditType, TelEdit, ErrId }
     GetTypeTelephone : { TelType, SizeAll, Size1, Size2, Size3, ErrId }

     var Result = InitTelephone("Value");
     Result = FormatTelephone(TelNumber, 1);
     if (Result.ErrId == 0) {
         xxx = Result.TelEdit;

    if (Boolean(PhoneNumber( 編集電話番号 , "V" )) {
        // 検証ＯＫ ( 1 or 2 )
    } else {
        // 検証ＮＧ ( 0 )
    }

    switch (PhoneNumber( 編集電話番号 , "V" ) {
        case 0:    // 検証ＮＧ
        case 1:    // 検証ＯＫ
        case 2:    // 未編集の正しい電話番号
    }

    // 編集エラーは "Phone Error"
    EditTelphone = PhoneNumber( 電話番号 , "F1" );

( テスト ツール　の ファイル は AddinBox サイト で ダウンロード できます )


【 JAVA 移植版 】 ( JAVA 8u192 にて動作確認済 )

・ ソースコード ファイル : TelephoneCheck.java ( Ver 1.00 , 2022/8/2 ) 文字コード: UTF-8N
現在の局番データ は 2022/7/1 版です。
( この ソースコード ファイル は AddinBox サイト で ダウンロード できます )

・ 利用上の留意点
返却値は TelephoneCheckValue / TelephoneType クラスオブジェクト ( 下記 ) になります。
下記 クラス の コンストラクタ で初期値が設定されますので、他の言語版のような InitTelephone 関数はありません。

-- VaridateTelephone / FormatTelephone -- -- GetTypeTelephone --
public static class TelephoneCheckValue {
    public int TelType;
    public int EditType;
    public String TelEdit;
    public int ErrId;
}

         public static class TelephoneType {
    public int TelType;
    public int SizeAll;
    public int Size1;
    public int Size2;
    public int Size3;
    public int ErrId;
}

     TelephoneCheckValue Result = new TelephoneCheckValue();
     Result = FormatTelephone(TelNumber, 1);
     if (Result.ErrId == 0) {
         xxx = Result.TelEdit;

     If (PhoneNumber(TelNumber, "V").equals("0")) {
         // 検証ＮＧ ( "0" )
     } else {
         // 検証ＯＫ ( "1" or "2" )
     }

     // 編集エラーは "Phone Error"
     String EditTelphone = PhoneNumber(TelNumber, "F1");
( テスト ツール　の ファイル は AddinBox サイト で ダウンロード できます )


【 PHP 移植版 】 ( PHP 5.6.39 にて動作確認済 )

・ ソースコード ファイル : TelephoneCheck.php ( Ver 1.00 , 2022/8/2 ) 文字コー: UTF-8N
現在の 局番データは 2022/7/1 版です。
( この ソースコード ファイル は AddinBox サイト で ダウンロード できます )

・ 利用上の留意点
返却値は以下の連想配列になります。
     ValidateTelephone / Formattelephone : [ TelType, EditType, TelEdit, ErrId ]
     GetTypeTelephone : [ TelType, SizeAll, Size1, Size2, Size3, ErrId ]

     $Result = InitTelephone("Value");
     $Result = FormatTelephone($TelNumber, 1);
     if ($Result["ErrId"] == 0) {
         xxx = $Result["TelEdit"];

     If ((bool)PhoneNumber($TelNumber, "V")) {
         // 検証ＯＫ ( 1 or 2 )
     } else {
         // 検証ＮＧ ( 0 )
     }

     // 編集エラーは "Phone Error"
     $EditTelphone = PhoneNumber($TelNumber, "F1");
( テスト ツール　の ファイル は AddinBox サイト で ダウンロード できます )


【 Perl 移植版 】 Perl 5.14.2 にて動作確認済

・ ソースコード ファイル : TelephoneCheck.pl ( Ver 1.00 , 2022/8/2 ) 文字コード:UTF-8N
現在の局番データは 2022/7/1 版です。
( この ソースコード ファイル は AddinBox サイト で ダウンロード できます )

・ 利用上の留意点
返却値は以下の連想配列になります。
     ValidateTelephone / Formattelephone : ( TelType, EditType, TelEdit, ErrId )
     GetTypeTelephone : ( TelType, SizeAll, Size1, Size2, Size3, ErrId )

     my %Result = InitTelephone("Value");
     %Result = FormatTelephone($TelNumber, 1);
     if ($Result{ErrId} == 0) {
         xxx = $Result{TelEdit};

     If (PhoneNumber($TelNumber, "V")) {
         # 検証ＯＫ ( 1 or 2 )
     } else {
         # 検証ＮＧ ( 0 )
     }

     # 編集エラーは "Phone Error"
     $EditTelphone = PhoneNumber($TelNumber, "F1");
( テスト ツール　の ファイル は AddinBox サイト で ダウンロード できます )


【 Python 移植版 】 Python 3.7.2 にて動作確認済

・ ソースコード ファイル : TelephoneCheck.py ( Ver 1.00 , 2022/8/2 ) 文字コード:UTF-8N, TABインデント
現在の局番データは 2022/7/1 版です。
( この ソースコード ファイル は AddinBox サイト で ダウンロード できます )

・ 利用上の留意点
返却値は以下の辞書オブジェクトになります(キーは大文字混じり)。
     validate_telephone / format_telephone : { TelType, EditType, TelEdit, ErrId }
     get_type_telephone : { TelType, SizeAll, Size1, Size2, Size3, ErrId }

     result = init_telephone('Value')
     result = format_telephone(tel_number, 1)
     if (result['ErrId'] == 0):
         xxx = result['TelEdit']

     If (bool(phone_number(tel_number, "V"))):
         # 検証ＯＫ ( 1 or 2 )
     else:
         # 検証ＮＧ ( 0 )

     # 編集エラーは "Phone Error"
     edit_telphone = phone_number(tel_number, "F1");
( テスト ツール　の ファイル は AddinBox サイト で ダウンロード できます )


【 Ruby 移植版 】 Ruby 2.5.3 にて動作確認済み

・ ソースコード ファイル : TelephoneCheck.rb ( Ver 1.00 , 2022/8/2 ) 文字コード:UTF-8N
現在の局番データは 2022/7/1 版です。
( この ソースコード ファイル は AddinBox サイト で ダウンロード できます )

・ 利用上の留意点
返却値は以下のハッシュ ( キー は シンボル指定 / 大文字混じり ) になります。
     validate_telephone / format_telephone : { TelType, EditType, TelEdit, ErrId }
     get_type_telephone : { TelType, SizeAll, Size1, Size2, Size3, ErrId }

     result = init_telephone("Value")
     result = format_telephone(tel_number, 1)
     if (result[:ErrId] == 0):
         xxx = result[:TelEdit]

     If (bool(phone_number(tel_number, "V")))
         # 検証ＯＫ ( 1 or 2 )
     else
         # 検証ＮＧ ( false , Ruby 版では 0 の代わりに false を返します )
     end

     # 編集エラーは "Phone Error"
     edit_telphone = phone_number(tel_number, "F1")
( テスト ツール　の ファイル は AddinBox サイト で ダウンロード できます )


【 VBA/VB6 移植版 】 ( Excel 2010 / VBA にて動作確認済 )

・ ソースコード ファイル : TelephoneCheck_VBA.bas ( Ver 1.00 , 2022/8/2 ) 文字コード: Shift_JIS
現在の局番データは 2022/7/1 版です。
( この ソースコード ファイル は AddinBox サイト で ダウンロード できます )

・ 利用上の留意点
( a ) Excel に限らず、Office 2000 以降のアプリケーション ( Access 等 ) で利用できます。

( b ) ソースコードファイル( TelephoneCheck_VBA.bas ) を「インポート」でワークブック等に組み込ん
でください。 モジュール名指定の Attribute ステートメントが入っていますので、インポートすれば
標準モジュール [ TelephoneCheck ] として組み込まれます。

( c ) 返却値は ValidateTelephone / FormatTelephone / GetTypeTelephone の ３ 関数【共通】の
下記 ユーザー定義型 ( Type ) です。 初期化関数の InitTelephone は「引数無し」です。
        Public Type TelephoneStruct
            TelType   As Integer
            EditType  As Integer
            TelEdit   As String
            ErrId     As Integer
            SizeAll   As Integer
            Size1     As Integer
            Size2     As Integer
            Size3     As Integer
        End Type

( d ) FreeRegExpTelephone サブルーチン
正規表現チェック用オブジェクト ( VBScript.RegExp ) の消去を行なうサブルーチンです。
マクロの一覧に載らないようにダミー引数を設けています。引数には 0 を指定します。
Call FreeRegExpTelephone( 0 )

ＶＢＡ/ＶＢ６ 版では、正規表現処理で [ CreateObject ("VBScript.RegExp") ] を使用します。
連続して 何十/何百回 と処理を繰り返し行なうケース を想定した場合、オブジェクト を毎回生成
すると処理速度が非常に落ちてしまいます。それを回避する為に、VBScript.RegExp オブジェクト
を 【 モジュールレベル変数 】 としました ( ソースコード参照 )。
FreeRegExpTelephone はモジュールレベル変数の RegExp を解放する為の サブルーチンです。
尚、このサブルーチンを使わず、アプリケーション終了時の自動解放に任せても構いません。

    Dim Result As TelephoneStruct
    Result = InitTelephone()
    Result = FormatTelephone(TelNumber, 1)
    If (Result.ErrId = 0) Then
        xxx = result.TelEdit

    -- PhoneNumber 利用例 --
    If (CBool(PhoneNumber(TelNumber, "V"))) Then
        ' 検証ＯＫ ( 1 or 2 )
    Else
        ' 検証ＮＧ ( 0 )
    End If
    EditTelphone = PhoneNumber(TelNumber, "F1")  ' 編集エラーは "Phone Error"

( テスト ツール　の ファイル は AddinBox サイト で ダウンロード できます )


【 VB.net 移植版 】 ( VB 2017 (VS 2017) / .NET Framework 4.6.2 にて動作確認済 )

・ ソースコード ファイル : TelephoneCheck_VBnet.vb ( Ver 1.00 , 2022/8/2 ) 文字コード: Shift_JIS
現在の局番データは 2022/7/1 版です。
( この ソースコード ファイル は AddinBox サイト で ダウンロード できます )

・ 利用上の留意点
返却値は下記の構造体 ( TelephoneCheckValue / TelephoneType Structure ) になります。
初期化は構造体に定義してある New コンストラクタ で行ないます。変数定義の際はダミー引数で 0 を指定して
ください。他の言語版のような InitTelephone 関数はありません。

--VaridateTelephone / FormatTelephone -- -- GetTypeTelephone --
public Structure TelephoneCheckValue
    public TelType As Integer
    public EditType As Integer
    public TelEdit As String
    public ErrId As Integer
End Structure

         public Structure TelephoneType
    public TelType As Integer;
    public SizeAll As INteger
    public Size1 As Integer
    public Size2 As Integer
    public Size3 As Integer
    public ErrId As Integer
End Structure

PhoneNumber 関数は オーバーロード関数 ( 返却値の型が変わります )です。
第 ２ 引数： Action を省略
・・・ ValidateTelephone による検証。 返却値は 数値 ( 0, 1, 2 )です。
第 ２ 引数: Action に 数値( 1 ～ 6 ) を指定
・・・ FormatTelephone による編集。 返却値は 文字列 です。

     TelephoneCheckValue Result = New TelephoneCheckValue( 0 )
     Result = FormatTelephone(TelNumber, 1)
     If (Result.ErrId = 0) Then
         xxx = Result.TelEdit

     If (CBool(PhoneNumber(TelNumber))) Then
         ' 検証ＮＧ ( 0 )
     Else
         ' 検証ＯＫ ( 1 or 2 )
     End If

     ' 編集エラーは "Phone Error"
     String EditTelphone = PhoneNumber(TelNumber, 1)
( テスト ツール　の ファイル は AddinBox サイト で ダウンロード できます )


【 使用条件・更新履歴 等 】

----- 使 用 条 件 -----
『 電話番号 編集/検証 ツール TelephoneCheck 』 は フリー ウェアです。
配布ファイル / プログラム の 内容を変更しないという条件で使用/再配布は自由です。

----- 他 言語 への移植について -----
「他 言語」 への移植については必ずご連絡をお願いします。

また、「他 言語」 の ライブラリ 共有 コミュニティ ( GitHub 等 ) へ 無断 ( 事後承諾 含む ) で
アップロード されますと、私 ( AddinBox 角田 ) の 管理 から外れてしまいますので御遠慮願います。
----- 著作権・免責 -----
『 電話番号 編集/検証 ツール TelephoneCheck 』 の全ての著作権は 「作者：角田 桂一」 が保持します。
尚､ この ソフト を使用したことで発生したいかなる損害についても、作者は一切責任を負わないものとします。

----- 連 絡 先 -----
『 角田 桂一 （つのだ けいいち） addinbox@h4.dion.ne.jp 』
『 ホーム ページ http://addinbo.sakura.ne.jp/index.htm 』

----- 更新履歴 -----

以下、 ベース バージョン である JavaScript 版 の更新履歴です。
( 多言語 移植版 個々の修正履歴は掲載していません)

・ 2022/8/2 Ver 1.00 ( 翻訳テーブル： 2022/7/1 版 )
[ 市内局番化 : 09496-x ⇒ 0949-6x ]
[ 局番の削除 : 0256-26 , 0283-78 , 0428-98 , 086-369 ]

・ 2020/7/20 Ver 1.00 ( 翻訳テーブル： 2020/6/1 版 )
[ 局番の追加 : 0158-3x , 0163-9x , 0539-61 , 0865-50 , 0980-6x , 0980-9x ]
[ 局番の削除 : 015-41x , 0163-7x , 0164-7x , 0278-4x , 086-365 , 086-367 , 086-998 ]
・ 2019/5/11 Ver 1.00 ( 翻訳テーブル： 2019/5/7 版 , [ 025-60x , 025-80x ] の局番追加 )
・ 2019/4/4 Ver 1.00 ( 翻訳テーブル： 2019/4/1 版 ) 正式版 の リリース
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
β 4.40 ( 2019/3/27 ) 以下の変更を施しました。
( a ) ValidateTelephone / FormatTelephone の簡易インターフェース [ PoneNumber 関数 ] を追加しました。

β 4.30 ( 2019/3/24 ) 以下の変更を施しました。
( a ) 返却値を受け取る変数に初期化データを渡す InitTelephone 関数を追加しました。

β 4.20 ( 2019/3/19 ) 以下の変更を施しました。
( a ) FormatTelephone において 「未使用局番」 の ErrId 値が間違っていましたのを修正しまｓた。

β 4.10 ( 2019/3/16 ) 以下の変更を施しました。
( a ) 番号翻訳テーブル の修正です。 [ 0499x-x , 056x-xx , 0851x-x , 0991x-x ]番号域において、
未割当な市外局番(04993 等)が有効になっていましたので修正しました。
AreaCode4JSON.json ならびに ソースコード内収録データ を差し替えました。

β 4.01 ( 2019/3/14 ) 以下の変更を施しました。
( a ) 動作に不具合はありませんでしたが、GetTypeTelephone 内で [文字列⇒数値] 変換に
eval 関数を使用していたところを Number 関数に変更しました

β 4.00 ( 2019/3/13 ) 以下の変更を施しました。
( a ) 多言語移植版 ( 番号翻訳テーブル内包 ) の名称に合わせる為、再度ファイル名を変更しました。
JSON 利用版 ：TelephoneCheck.js ⇒ TelephoneCheck_withJSON.js
JSON 未使用版 ： TelephoneCheck_UnusedJSON.js ⇒ TelephoneCheck.js

( b ) GetTypeTelephone 関数 を追加 して 番号翻訳処理を FormatTelephone から移管しました。
これに伴い FormatTelephone はGetTypeTelephone を利用して編集処理を行なうように変更しました。

( c ) ValidateTelephone に ErrId : 5 (局番タイプの桁数と不一致)を追加しました。
FormatTelephone で ErrId : 4 (引数不正(EditType)) を ErrId : 6 に改め、
新たに ErrId : 4 (局番タイプの桁数と不一致) を追加しました。

β 3.00 ( 2019/3/8 ) 以下の変更を施しました。
( a ) ファイル名を変更しました。 ( ValidateTelephone.js ⇒ TelephoneCheck.js )

( b ) 返却値の要素名を一部変更しました。
( Result.Type ⇒ Result.TelType , Result.Edit ⇒ Result.TelEdit , Result.Error ⇒ Result.ErrId )

( c ) ソースコード の見直しを行ない、携帯電話 ( 070/080/090 )/着信課金 ( 0120/0800) 等の局番も
番号翻訳テーブルに収容する構成に変更しました。

β 2.00 ( 2019/2/26 )
返却値 ( Type ) の エラー( other ) の値を [ 9 から -1 ] に改め、下記番号を追加サポート
M2M ( 020x ), ポケベル ( 0204 ), FMC ( 0600 ), 情報料代理徴収 ( 0990 ), 全国統一番号 ( 0570 )

β 1.20 ( 2019/2/19 )
ValidateTelephone で [ 数字のみ(電話番号パターン OK) ] で Error = 8 (OK) を追加

β 1.10 ( 2019/2/15 )
市内局番 1桁目が [ 0 or 1 ] 判定を追加

β 1.00 ( 2019/2/14 )
JavaScript 移植 初 版 ( ValidateTelephone.js )

------ ( 2004/10/31 )
ktTelEdit 関数 として kt電話郵便アドイン Ver 1.00 ( Excel ) にて 初 リリース