scala - google i18 包的手机号码验证问题
问题描述
我正在使用谷歌 i18 包
package com.google.i18n.phonenumbers;
private val mobileRule = genValidation("mobile", _.notificationChannels.find(_.channel == "mobile").forall { channel =>
channel.channelId.exists(number => !numberUtil.isValidNumber(numberUtil.parse(number, "GB")))
}, "the mobile number entered is not valid or has not been entered")
private val landlineRule = genValidation("landline", _.notificationChannels.find(_.channel == "landline").exists { channel =>
channel.channelId.exists(number => !numberUtil.isValidNumber(numberUtil.parse(number, "GB")))
}, "the landline number entered is not valid")
有了这个 i18 包,如果我传递了一个 17 位的手机号码,那么它会接受,否则它会给我 500 错误,有人可以帮我解决这个问题,如果我传递的数字大于 10,它会给我某种类型的错误,比如手机号码不正确。
使用上面的代码,如果我通过小于 10 则给我错误,即手机号码不正确,这很好,但我希望如果我通过大于 10,那么在这种情况下它也会给我 500 错误。
如果有人有想法,请帮忙。
解决方案
您应该将数字从 10 位转换为 15 位 E.164。E.164 是一种国际电话编号方案,可确保 PSTN 上的每台设备都有全球唯一的号码。
这个号码允许电话和短信可以正确地路由到不同国家的个人电话。E.164 号码的格式为 [+] [国家代码] [用户号码,包括区号],最多可以有 15 位数字。E.164 数字 E.164 格式示例
国家代码
国家
订户号码
+14155552671
1
我们
4155552671
+442071838750
44
国标
2071838750
+551155256325
55
BR
1155256325
public static String formatE164(String countryCode, String number) {
try {
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
int parsedCountryCode = Integer.parseInt(countryCode);
PhoneNumber parsedNumber = util.parse(number,
util.getRegionCodeForCountryCode(parsedCountryCode));
return util.format(parsedNumber, PhoneNumberUtil.PhoneNumberFormat.E164);
} catch (NumberParseException | NumberFormatException npe) {
Log.w(TAG, npe);
}
return "+" +
countryCode.replaceAll("[^0-9]", "").replaceAll("^0*", "") +
number.replaceAll("[^0-9]", "");
}
推荐阅读
- angular - 如何通过 CDK 覆盖包含包含其他非 HTML 元素(如 mat-icon)的 Angular 组件
- oracle - ISO8859-15 (Latin-9) 是 UTF-8 的完整子选择吗?
- java - 在java中声明自定义可配置应用程序的配置?
- git - Azure DevOps:每次合并时附加工作项的数量不断增加
- python - 运行长时间的子进程并在执行结束前获取标准输出
- java - 数组是否应该比 ArrayLists 快这么多?
- webpack - 无法使用“html-loader”解析资产
- c# - c# 异步调用泛型委托
- laravel - Laravel 7 - return view()->with('some data) 是如何工作的?
- python - 关于连体CNN的准确性