LoginSignup
63
63

More than 5 years have passed since last update.

ハイフンなしの電話番号からハイフン付き電話番号を復元する。

Last updated at Posted at 2013-02-16

時として荒れた作業が必要になることもありますw

一般的な法則(アルゴリズム)があるのかと思ったらどうもないようだ。
という訳で総務省のデータを活用すればそれっぽく動くものは出来た。

漏れがあると思うので気づいた方は教えて下さいm(_ _)m

require 'pp'
require 'tel_splitter'

pp TelSplitter.split("0688889999")

> ["06", "8888", "9999"]

※2013/02/16時点の情報を元にしています。

tel_splitter.rb
# encoding: utf-8

module TelSplitter
  MAP = {
  # 市外局番 , 市内局番の桁数のマップ
  # http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html のデータを利用
  # 固定電話以外の桁数は適当です...
  '050' => 4, # IP電話
  '070' => 4, # 携帯電話/PHS
  '080' => 4, # 携帯電話
  '090' => 4, # 携帯電話
  '020' => 3,  # その他
  '0120' => 3, # その他
  '0800' => 3, # その他
  '0570' => 3, # その他
  '0990' => 3, # その他
  # 固定電話
  '011' => 3, '0123' => 2, '0123' => 2,
  '0123' => 2, '0124' => 2, '0125' => 2,
  '0126' => 2, '01267' => 1, '0133' => 2,

  # 長すぎるので中略
  # https://gist.github.com/kennyj/4966002
  # に全部のっけました。

  '0987' => 2, '09912' => 1, '09913' => 1,
  '099' => 3, '0993' => 2, '0993' => 2,
  '099' => 3, '0994' => 2, '0994' => 2,
  '0995' => 2, '0995' => 2, '0996' => 2,
  '0996' => 2, '09969' => 1, '0997' => 2,
  '0997' => 2, '0997' => 2, '0997' => 2,
  '0997' => 2
  }

  # 市外局番長毎のマップを作成する
  5.downto(2) do |i|
    const_set("MAP_#{i}", MAP.reject { |k, v| k.length != i })
  end

  def self.split(tel)
    # 市外局番の長いものから探していく
    [MAP_5, MAP_4, MAP_3, MAP_2].each do |map|
      len = map.first[0].length
      if map.has_key?(tel[0, len])
        len_2 = map[tel[0, len]] # 市内局番の長さ
        return [tel[0, len], tel[len, len_2], tel[(len + len_2)..-1]]
      end
    end
    # 見つからなかった(もしくは強制的に区切る)
    return [tel, "", ""]
  end
end
63
63
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
63
63