一、闲谈
手机号码的格式千变万化,不同国家的手机号码格式有很大的差异,细细研究,会发现很多有意思的事情,
比如:
你以为手机号码都是数字组成的?当然不,
在以色列,1-800-Flowers 也是一个合法的手机号,
而在埃及,手机号码可能是下面的象形文字哦
其实这些有趣的小故事都可以在 google 开源的库中找到:地址
所以,很显然,本文所提及的解决方案,其实就是 google 的这个类库的使用方法。
</p>
二、设计
关于手机号校验的设计,会涉及到几个点:
① 手机号码数据类型
上文也提过,手机号码也会出现字符哦,所以,肯定不能使用 int 等数字类型,况且手机号码也基本不会用来进行计算操作。
② 长度
手机号码长度其实是依据各个国家的设计而不相同的,
比如大陆就是11位手机号,而瑞士,据说会有8位的号码。
那么应该使用多长的字段来保存呢?其实手机号保留 20 位长度,目前是比较安全的,所以,数据库设计为 varchar 50 是妥妥没问题的。
③ 页面设计
其实最佳的体验是分为两个框,一个下拉框用来选择区号,另一个输入框用来输入手机号。
④ 手机号校验
诚然,如果强制要求有验证码校验,那么是最佳的,但时如果没有的话,那么在此推荐 google 的手机号码校验类库:libphonenumber
比如亚马逊aws的注册页面,就没有进行号码的规制校验,但时强制使用了验证码校验。
关于 libphonenumber,该类库提供了 Java、JS等实现,上手简单,功能强大。而且还提供了运营商查询、归属地查询等功能。
三、类库的使用
① jar包引入
如果是使用 maven 来构建地址,需要引入如下几个库
1 | <!--手机号解析--> |
② 工具类代码
1 | import com.google.i18n.phonenumbers.NumberParseException; |
③ 工具类使用说明
结构很简单,见下图:
四、总结
① 由于手机号码的规则一直是处于更新状态的,所以建议jar包的版本要常更新,
可以常逛逛 maven 仓库:https://repo1.maven.org/maven2/com/googlecode/libphonenumber/
② 手机号校验千万要加区号,否则会有歧义,如下 10 位长度手机号:
857 498 4492
10位手机号按理应该是国外的,但是你如果使用国内的区号来校验会发现,该号码是“贵州毕节”的,
至于该号码到底是什么,暂未摸清楚。