phoneNumberTools.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import {
  2. parsePhoneNumberFromString,
  3. CountryCode,
  4. } from "libphonenumber-js";
  5. import {
  6. IS_VALID_FULL_PHONE,
  7. } from "@utils/constants";
  8. /**
  9. * 统一处理历史脏数据
  10. * @param phone - 原始电话号码
  11. * @param country - ISO 3166-1 alpha-2 国家码(如 US, CN)
  12. * @returns 格式化后的 E.164 电话号,区号和号码之间用空格分隔
  13. */
  14. export function normalizePhoneForForm(
  15. phone?: string,
  16. country?: string,
  17. ): string {
  18. if (!phone) {
  19. return "";
  20. }
  21. if(IS_VALID_FULL_PHONE.test(phone)) {
  22. return phone;
  23. }
  24. try {
  25. const parsed = parsePhoneNumberFromString(phone, country as CountryCode);
  26. console.log(phone + " parsed ----: ", parsed,parsed?.isValid());
  27. if (parsed?.isValid()) {
  28. // E.164 的号码是 +12135551234
  29. // 我们在返回时加空格分隔区号和号码
  30. return `+${parsed.countryCallingCode} ${parsed.nationalNumber}`;
  31. }
  32. if(parsed?.isPossible()) {
  33. return `+${parsed.countryCallingCode} ${parsed.nationalNumber}`;
  34. }
  35. } catch {
  36. // parse 出错时忽略,走 fallback
  37. }
  38. // fallback: 除了数字,其他符号均移除
  39. const digits = phone.replace(/[^\d]/g, "");
  40. // 没有 + 的情况,给默认国家区号
  41. const defaultCallingCode =
  42. country === "CN"
  43. ? "+86"
  44. : country === "GB"
  45. ? "+44"
  46. : "+1";
  47. return `${defaultCallingCode} ${digits}`;
  48. }