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

Viv*_*art 18 java formatting localization

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

国家代码= 91

区号= 9567

当地号码= 123456

Kev*_*ion 50

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

  • 但是我没有看到任何显示区号的方法。我错过了什么吗? (2认同)

Dea*_*ing 23

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

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

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


Ste*_*eet 6

正如很多人所提到的,您不能通过简单的字符串匹配来做到这一点。国家或地区代码的长度都不固定。

过去完成此操作后,我们维护了一个结构类似于以下的表:-

+------------+---------+--------+-------------+
|国家代码|地区代码|国家|地区|
+------------+---------+--------+-------------+
|44 |1634 |英国 |梅德韦 |
|44 |20 |英国 |伦敦 |
|964 |23 |伊拉克|瓦西特(Al Kut)|
|964 |2412 |伊拉克|虚幻|
+------------+---------+--------+-------------+

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

所以给定号码 441634666788

我们将从子字符串 [1,7] 开始(7 是最长的国家/地区代码组合的长度),没有找到匹配项,然后转到 [1,6] 并找到 UK/Medway 的匹配项。

效率不是很高,但确实有效。

编辑

您也可以尝试类似的方法,但您需要使用完整的数据集对其进行测试,甚至可能将其分解为单独的国家和地区代码选择,因为它对于您选择的数据库可能性能不佳。

 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
Run Code Online (Sandbox Code Playgroud)

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