numberUtil.js 2.7 KB

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