如何将手机号码分为国家代码,区号和本地号码?

时间:2010-03-30 08:59:37

标签: java localization formatting

如何将手机号码拆分为国家/地区代码,区号和本地号码? 例如拆分后的+919567123456

国家/地区代码= 91

区号= 9567

本地号码= 123456

7 个答案:

答案 0 :(得分:48)

不要维护自己的所有这些数据表!使用“Java International Phone Number Utilities library v3.0”,https://github.com/googlei18n/libphonenumber。这就是Google使用的,Google会为您维护它!

答案 1 :(得分:22)

使用简单的算法解析电话号码是不可能的,您需要使用填写了每个国家/地区规则的数据表 - 因为每个国家/地区都以不同的方式划分电话号码。

国家/地区代码相当简单,只需使用维基百科中Country calling codes文章中的数据,并构建一个包含所有唯一国家/地区代码的表格。每个国家/地区都有一个唯一的前缀,因此很容易。

但是,您需要查找要支持的每个国家/地区的规则,并使用每个国家/地区的规则提取区号。

答案 2 :(得分:4)

正如各种人所说,你不能用简单的字符串匹配来做到这一点。国家和地区代码的长度都是固定的。

在过去做过这个时,我们维护了一个类似于以下结构的表: -

+------------+---------+-------+--------------+
|country_code|area_code|country|area          |
+------------+---------+-------+--------------+
|44          |1634     |UK     |Medway        |
|44          |20       |UK     |London        |
|964         |23       |Iraq   |Wasit (Al Kut)|
|964         |2412     |Iraq   |Unreal        |
+------------+---------+-------+--------------+

然后我们计算了area_code和country_code的最大长度,并通过从最大长度开始的子串,检查字符串,然后向下工作,直到找到匹配为止。

所以给出了号码441634666788

我们可以从子串[1,7]开始(7是最长的国家/地区代码组合的长度),找不到匹配,然后转到[1,6]并找到匹配的英国/梅德韦。

效率不高但有效。

编辑

你也可以尝试这样的东西,但是你需要用完整的数据集进行测试,或者甚至将它分解成单独的国家和地区代码选择,因为它可能不是很适合你所选择的数据库。

 DECLARE @area_codes TABLE
(
    country_code VARCHAR(10),
    area_code VARCHAR(10),
    country VARCHAR(20),
    area VARCHAR(20),
    match_string VARCHAR(MAX),
    match_length INTEGER
)

INSERT INTO @area_codes VALUES ('44','1382','UK','Dundee', '441382%', 6)
INSERT INTO @area_codes VALUES ('44','1386','UK','Evesham', '441386%', 6)
INSERT INTO @area_codes VALUES ('44', '1', 'UK', 'Geographic numbers', '441%', 3)

DECLARE @number VARCHAR(MAX)
SET @number = '441386111111'

SELECT TOP 1 * 
FROM @area_codes 
WHERE @number LIKE match_string
ORDER BY match_length DESC

您可以通过触发器维护match_string和match_length字段,注意处理空区域代码并在match_string列上索引表。

答案 3 :(得分:3)

我认为你需要像国家和地区代码字典这样的东西。因为他们的摊位可以有不同的长度。美国+1,德国+49,甚至+6723。与区号相同..

答案 4 :(得分:3)

答案很大程度上取决于国家。没有通用规则说“这是国家代码,这是区号,这是本地号码”。可以普遍获得的唯一信息是国家号码(甚至可以是1-4位数字);那么你需要咨询具体国家的规则集。

对于示例(例如,“指定国家/地区有许多不同的电话号码,但它们都遵循相同的格式”):

  • +420123456789是捷克共和国的一个(虚假)号码(国家代码+420),其余的是本地号码(有些国家/地区使用未划分的寻址空间,尽管您可以从第一个数据中推断出一些数据)本地号码的-4位数字(例如“+420800是免费电话号码”))。因此,解析此数字的唯一有用方法分为两部分, +420 123456789
  • +18005551234是美国的一个(可能也是假的)号码;根据{{​​3}},+ 1是国家代码,800是区号(免费电话号码),555是交换代码,1234是本地号码。然后,您可以将该号码分解为四个部分, +1 800 555 1234

答案 5 :(得分:1)

如果您努力准确英国数据,请参阅http://code.google.com/p/ofcom-csverter/以获取包含更正的英国区号的完整列表。

答案 6 :(得分:0)

一个非常复杂的问题。首先,您需要确定country code。根据国家/地区代码,其余部分必须分为区号和本地号码。但这三个部分都没有固定的长度,不是孔数,也不是区号和局部组合!

示例:4930123456789

  • 49是德国的国家代码
  • 30是柏林的区号
  • 123456789是柏林的本地号码(不是真实的)

示例:493328123456

  • 49是德国的国家代码
  • 3328是Teltow的区号
  • 123456是Teltow的本地号码(没有真实的)

示例:34971123456

  • 34是西班牙的国家代码
  • 971是Mallorca的区号。
  • 123456是马略卡岛上的本地号码(不是真实的)