首页 > 解决方案 > 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 错误。

如果有人有想法,请帮忙。

标签: scala

解决方案


您应该将数字从 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]", "");
}
 

推荐阅读