number-364babbc.js 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*!
  2. * All material copyright ESRI, All Rights Reserved, unless otherwise specified.
  3. * See https://github.com/Esri/calcite-components/blob/master/LICENSE.md for details.
  4. * v1.0.0-beta.82
  5. */
  6. 'use strict';
  7. function isActivationKey(key) {
  8. return key === "Enter" || key === " ";
  9. }
  10. const numberKeys = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
  11. function isValidNumber(numberString) {
  12. return !(!numberString || isNaN(Number(numberString)));
  13. }
  14. function parseNumberString(numberString) {
  15. if (!numberString || !stringContainsNumbers(numberString)) {
  16. return "";
  17. }
  18. return sanitizeExponentialNumberString(numberString, (nonExpoNumString) => {
  19. let containsDecimal = false;
  20. const result = nonExpoNumString
  21. .split("")
  22. .filter((value, i) => {
  23. if (value.match(/\./g) && !containsDecimal) {
  24. containsDecimal = true;
  25. return true;
  26. }
  27. if (value.match(/\-/g) && i === 0) {
  28. return true;
  29. }
  30. return numberKeys.includes(value);
  31. })
  32. .reduce((string, part) => string + part);
  33. return isValidNumber(result) ? Number(result).toString() : "";
  34. });
  35. }
  36. function sanitizeDecimalString(decimalString) {
  37. const decimalAtEndOfStringButNotStart = /(?!^\.)\.$/;
  38. return decimalString.replace(decimalAtEndOfStringButNotStart, "");
  39. }
  40. function sanitizeNegativeString(negativeString) {
  41. const allHyphensExceptTheStart = /(?!^-)-/g;
  42. return negativeString.replace(allHyphensExceptTheStart, "");
  43. }
  44. function sanitizeLeadingZeroString(zeroString) {
  45. const allLeadingZerosOptionallyNegative = /^([-0])0+(?=\d)/;
  46. return zeroString.replace(allLeadingZerosOptionallyNegative, "$1");
  47. }
  48. function sanitizeNumberString(numberString) {
  49. return sanitizeExponentialNumberString(numberString, (nonExpoNumString) => {
  50. const sanitizedValue = sanitizeNegativeString(sanitizeDecimalString(sanitizeLeadingZeroString(nonExpoNumString)));
  51. const isNegativeDecimalOnlyZeros = /^-\b0\b\.?0*$/;
  52. return isValidNumber(sanitizedValue)
  53. ? isNegativeDecimalOnlyZeros.test(sanitizedValue)
  54. ? sanitizedValue
  55. : Number(sanitizedValue).toString()
  56. : nonExpoNumString;
  57. });
  58. }
  59. function sanitizeExponentialNumberString(numberString, func) {
  60. if (!numberString) {
  61. return numberString;
  62. }
  63. const firstE = numberString.toLowerCase().indexOf("e") + 1;
  64. return numberString
  65. .replace(/[eE]*$/g, "")
  66. .substring(0, firstE)
  67. .concat(numberString.slice(firstE).replace(/[eE]/g, ""))
  68. .split(/[eE]/)
  69. .map((section, i) => (i === 1 ? func(section.replace(/\./g, "")) : func(section)))
  70. .join("e")
  71. .replace(/^e/, "1e");
  72. }
  73. function stringContainsNumbers(string) {
  74. return numberKeys.some((number) => string.includes(number));
  75. }
  76. exports.isActivationKey = isActivationKey;
  77. exports.isValidNumber = isValidNumber;
  78. exports.numberKeys = numberKeys;
  79. exports.parseNumberString = parseNumberString;
  80. exports.sanitizeDecimalString = sanitizeDecimalString;
  81. exports.sanitizeExponentialNumberString = sanitizeExponentialNumberString;
  82. exports.sanitizeNumberString = sanitizeNumberString;