numberUtil.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.getNumberPrecision = getNumberPrecision;
  6. exports.isE = isE;
  7. exports.isEmpty = isEmpty;
  8. exports.num2str = num2str;
  9. exports.trimNumber = trimNumber;
  10. exports.validateNumber = validateNumber;
  11. var _supportUtil = require("./supportUtil");
  12. function isEmpty(value) {
  13. return !value && value !== 0 && !Number.isNaN(value) || !String(value).trim();
  14. }
  15. /**
  16. * Format string number to readable number
  17. */
  18. function trimNumber(numStr) {
  19. var str = numStr.trim();
  20. var negative = str.startsWith('-');
  21. if (negative) {
  22. str = str.slice(1);
  23. }
  24. str = str
  25. // Remove decimal 0. `1.000` => `1.`, `1.100` => `1.1`
  26. .replace(/(\.\d*[^0])0*$/, '$1')
  27. // Remove useless decimal. `1.` => `1`
  28. .replace(/\.0*$/, '')
  29. // Remove integer 0. `0001` => `1`, 000.1' => `.1`
  30. .replace(/^0+/, '');
  31. if (str.startsWith('.')) {
  32. str = "0".concat(str);
  33. }
  34. var trimStr = str || '0';
  35. var splitNumber = trimStr.split('.');
  36. var integerStr = splitNumber[0] || '0';
  37. var decimalStr = splitNumber[1] || '0';
  38. if (integerStr === '0' && decimalStr === '0') {
  39. negative = false;
  40. }
  41. var negativeStr = negative ? '-' : '';
  42. return {
  43. negative: negative,
  44. negativeStr: negativeStr,
  45. trimStr: trimStr,
  46. integerStr: integerStr,
  47. decimalStr: decimalStr,
  48. fullStr: "".concat(negativeStr).concat(trimStr)
  49. };
  50. }
  51. function isE(number) {
  52. var str = String(number);
  53. return !Number.isNaN(Number(str)) && str.includes('e');
  54. }
  55. /**
  56. * [Legacy] Convert 1e-9 to 0.000000001.
  57. * This may lose some precision if user really want 1e-9.
  58. */
  59. function getNumberPrecision(number) {
  60. var numStr = String(number);
  61. if (isE(number)) {
  62. var precision = Number(numStr.slice(numStr.indexOf('e-') + 2));
  63. var decimalMatch = numStr.match(/\.(\d+)/);
  64. if (decimalMatch !== null && decimalMatch !== void 0 && decimalMatch[1]) {
  65. precision += decimalMatch[1].length;
  66. }
  67. return precision;
  68. }
  69. return numStr.includes('.') && validateNumber(numStr) ? numStr.length - numStr.indexOf('.') - 1 : 0;
  70. }
  71. /**
  72. * Convert number (includes scientific notation) to -xxx.yyy format
  73. */
  74. function num2str(number) {
  75. var numStr = String(number);
  76. if (isE(number)) {
  77. if (number > Number.MAX_SAFE_INTEGER) {
  78. return String((0, _supportUtil.supportBigInt)() ? BigInt(number).toString() : Number.MAX_SAFE_INTEGER);
  79. }
  80. if (number < Number.MIN_SAFE_INTEGER) {
  81. return String((0, _supportUtil.supportBigInt)() ? BigInt(number).toString() : Number.MIN_SAFE_INTEGER);
  82. }
  83. numStr = number.toFixed(getNumberPrecision(numStr));
  84. }
  85. return trimNumber(numStr).fullStr;
  86. }
  87. function validateNumber(num) {
  88. if (typeof num === 'number') {
  89. return !Number.isNaN(num);
  90. }
  91. // Empty
  92. if (!num) {
  93. return false;
  94. }
  95. return (
  96. // Normal type: 11.28
  97. /^\s*-?\d+(\.\d+)?\s*$/.test(num) ||
  98. // Pre-number: 1.
  99. /^\s*-?\d+\.\s*$/.test(num) ||
  100. // Post-number: .1
  101. /^\s*-?\.\d+\s*$/.test(num)
  102. );
  103. }