parseDigits.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // These mappings map a character (key) to a specific digit that should
  2. // replace it for normalization purposes. Non-European digits that
  3. // may be used in phone numbers are mapped to a European equivalent.
  4. //
  5. // E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.
  6. //
  7. export const DIGITS = {
  8. '0': '0',
  9. '1': '1',
  10. '2': '2',
  11. '3': '3',
  12. '4': '4',
  13. '5': '5',
  14. '6': '6',
  15. '7': '7',
  16. '8': '8',
  17. '9': '9',
  18. '\uFF10': '0', // Fullwidth digit 0
  19. '\uFF11': '1', // Fullwidth digit 1
  20. '\uFF12': '2', // Fullwidth digit 2
  21. '\uFF13': '3', // Fullwidth digit 3
  22. '\uFF14': '4', // Fullwidth digit 4
  23. '\uFF15': '5', // Fullwidth digit 5
  24. '\uFF16': '6', // Fullwidth digit 6
  25. '\uFF17': '7', // Fullwidth digit 7
  26. '\uFF18': '8', // Fullwidth digit 8
  27. '\uFF19': '9', // Fullwidth digit 9
  28. '\u0660': '0', // Arabic-indic digit 0
  29. '\u0661': '1', // Arabic-indic digit 1
  30. '\u0662': '2', // Arabic-indic digit 2
  31. '\u0663': '3', // Arabic-indic digit 3
  32. '\u0664': '4', // Arabic-indic digit 4
  33. '\u0665': '5', // Arabic-indic digit 5
  34. '\u0666': '6', // Arabic-indic digit 6
  35. '\u0667': '7', // Arabic-indic digit 7
  36. '\u0668': '8', // Arabic-indic digit 8
  37. '\u0669': '9', // Arabic-indic digit 9
  38. '\u06F0': '0', // Eastern-Arabic digit 0
  39. '\u06F1': '1', // Eastern-Arabic digit 1
  40. '\u06F2': '2', // Eastern-Arabic digit 2
  41. '\u06F3': '3', // Eastern-Arabic digit 3
  42. '\u06F4': '4', // Eastern-Arabic digit 4
  43. '\u06F5': '5', // Eastern-Arabic digit 5
  44. '\u06F6': '6', // Eastern-Arabic digit 6
  45. '\u06F7': '7', // Eastern-Arabic digit 7
  46. '\u06F8': '8', // Eastern-Arabic digit 8
  47. '\u06F9': '9' // Eastern-Arabic digit 9
  48. }
  49. export function parseDigit(character) {
  50. return DIGITS[character]
  51. }
  52. /**
  53. * Parses phone number digits from a string.
  54. * Drops all punctuation leaving only digits.
  55. * Also converts wide-ascii and arabic-indic numerals to conventional numerals.
  56. * E.g. in Iraq they don't write `+442323234` but rather `+٤٤٢٣٢٣٢٣٤`.
  57. * @param {string} string
  58. * @return {string}
  59. * @example
  60. * ```js
  61. * parseDigits('8 (800) 555')
  62. * // Outputs '8800555'.
  63. * ```
  64. */
  65. export default function parseDigits(string) {
  66. let result = ''
  67. // Using `.split('')` here instead of normal `for ... of`
  68. // because the importing application doesn't neccessarily include an ES6 polyfill.
  69. // The `.split('')` approach discards "exotic" UTF-8 characters
  70. // (the ones consisting of four bytes) but digits
  71. // (including non-European ones) don't fall into that range
  72. // so such "exotic" characters would be discarded anyway.
  73. for (const character of string.split('')) {
  74. const digit = parseDigit(character)
  75. if (digit) {
  76. result += digit
  77. }
  78. }
  79. return result
  80. }