number.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. function isActivationKey(key) {
  7. return key === "Enter" || key === " ";
  8. }
  9. const numberKeys = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
  10. function isValidNumber(numberString) {
  11. return !(!numberString || isNaN(Number(numberString)));
  12. }
  13. function parseNumberString(numberString) {
  14. if (!numberString || !stringContainsNumbers(numberString)) {
  15. return "";
  16. }
  17. return sanitizeExponentialNumberString(numberString, (nonExpoNumString) => {
  18. let containsDecimal = false;
  19. const result = nonExpoNumString
  20. .split("")
  21. .filter((value, i) => {
  22. if (value.match(/\./g) && !containsDecimal) {
  23. containsDecimal = true;
  24. return true;
  25. }
  26. if (value.match(/\-/g) && i === 0) {
  27. return true;
  28. }
  29. return numberKeys.includes(value);
  30. })
  31. .reduce((string, part) => string + part);
  32. return isValidNumber(result) ? Number(result).toString() : "";
  33. });
  34. }
  35. function sanitizeDecimalString(decimalString) {
  36. const decimalAtEndOfStringButNotStart = /(?!^\.)\.$/;
  37. return decimalString.replace(decimalAtEndOfStringButNotStart, "");
  38. }
  39. function sanitizeNegativeString(negativeString) {
  40. const allHyphensExceptTheStart = /(?!^-)-/g;
  41. return negativeString.replace(allHyphensExceptTheStart, "");
  42. }
  43. function sanitizeLeadingZeroString(zeroString) {
  44. const allLeadingZerosOptionallyNegative = /^([-0])0+(?=\d)/;
  45. return zeroString.replace(allLeadingZerosOptionallyNegative, "$1");
  46. }
  47. function sanitizeNumberString(numberString) {
  48. return sanitizeExponentialNumberString(numberString, (nonExpoNumString) => {
  49. const sanitizedValue = sanitizeNegativeString(sanitizeDecimalString(sanitizeLeadingZeroString(nonExpoNumString)));
  50. const isNegativeDecimalOnlyZeros = /^-\b0\b\.?0*$/;
  51. return isValidNumber(sanitizedValue)
  52. ? isNegativeDecimalOnlyZeros.test(sanitizedValue)
  53. ? sanitizedValue
  54. : Number(sanitizedValue).toString()
  55. : nonExpoNumString;
  56. });
  57. }
  58. function sanitizeExponentialNumberString(numberString, func) {
  59. if (!numberString) {
  60. return numberString;
  61. }
  62. const firstE = numberString.toLowerCase().indexOf("e") + 1;
  63. return numberString
  64. .replace(/[eE]*$/g, "")
  65. .substring(0, firstE)
  66. .concat(numberString.slice(firstE).replace(/[eE]/g, ""))
  67. .split(/[eE]/)
  68. .map((section, i) => (i === 1 ? func(section.replace(/\./g, "")) : func(section)))
  69. .join("e")
  70. .replace(/^e/, "1e");
  71. }
  72. function stringContainsNumbers(string) {
  73. return numberKeys.some((number) => string.includes(number));
  74. }
  75. export { sanitizeExponentialNumberString as a, sanitizeDecimalString as b, isActivationKey as c, isValidNumber as i, numberKeys as n, parseNumberString as p, sanitizeNumberString as s };