useFilters.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. interface Filters {
  2. percentFormat: (value: number | string | null | undefined) => string;
  3. numberFormat: (value: number | string) => string;
  4. numberFormat1: (value: number | string) => string;
  5. pwdFormat: (value: string | number | null | undefined) => string;
  6. numberDecimal: (value: number | string, decimalPlaces?: number) => string;
  7. numberDesensitization: (value: number | string) => string;
  8. numberDesensitization1: (value: number | string) => string;
  9. }
  10. /**
  11. * 格式化工具组合式函数
  12. * @returns {Filters} 包含所有格式化方法的对象
  13. */
  14. export function useFilters(): Filters {
  15. /**
  16. * 百分比格式化
  17. */
  18. const percentFormat = (value: number | string | null | undefined): string => {
  19. if (value == null || value == undefined) {
  20. return '+0%';
  21. } else if (Number(value) < 0) {
  22. return value + '%';
  23. } else if (value == '+∞' || value == '-∞') {
  24. return String(value);
  25. } else {
  26. return '+' + value + '%';
  27. }
  28. };
  29. /**
  30. * 数字千分位格式化(支持负数)
  31. * @param {number | string} value - 要格式化的数字或字符串
  32. * @param decimalPlaces 保留的小数位数,默认为2
  33. * @returns {string} 格式化后的字符串
  34. */
  35. const numberFormat = (value: number | string,decimalPlaces:number = 2): string[] | string => {
  36. if (value == '***') {
  37. return '***';
  38. }
  39. if (isNaN(Number(value))||!value ) {
  40. return '0.00';
  41. }
  42. // let value1 = Number(value).toFixed(2)
  43. let value1 = numberDecimal(value,decimalPlaces);
  44. if (value1.indexOf('-') > -1) {
  45. value1 = value1.split('-')[1];
  46. let num = value1.split('.');
  47. let interCount = num[0].length;
  48. if (interCount < 3) {
  49. return numberDecimal(value,decimalPlaces);
  50. }
  51. let index = 0;
  52. let inter = '';
  53. for (let i = interCount - 3; i >= 0; i -= 3) {
  54. inter = num[0].substr(i, 3) + (inter == '' ? '' : ',') + inter;
  55. index = i;
  56. }
  57. if (index > 0) {
  58. inter = num[0].substr(0, index) + (inter == '' ? '' : ',') + inter;
  59. }
  60. // return toArray ? ['-' + inter,num[1]] : '-' + inter + (num.length == 1 ? '' : '.' + num[1]);
  61. return '-' + inter + (num.length == 1 ? '' : '.' + num[1]);
  62. } else {
  63. let num = value1.split('.');
  64. let interCount = num[0].length;
  65. if (interCount < 3) {
  66. return numberDecimal(value,decimalPlaces);
  67. }
  68. let index = 0;
  69. let inter = '';
  70. for (let i = interCount - 3; i >= 0; i -= 3) {
  71. inter = num[0].substr(i, 3) + (inter == '' ? '' : ',') + inter;
  72. index = i;
  73. }
  74. if (index > 0) {
  75. inter = num[0].substr(0, index) + (inter == '' ? '' : ',') + inter;
  76. }
  77. // return toArray ? [inter,num[1]] : inter + (num.length == 1 ? '' : '.' + num[1]);
  78. return inter + (num.length == 1 ? '' : '.' + num[1]);
  79. }
  80. };
  81. /**
  82. * 数字千分位格式化(简单版)
  83. */
  84. const numberFormat1 = (value: number | string): string => {
  85. if (value == '--') {
  86. return '--';
  87. }
  88. if (isNaN(Number(value))) {
  89. return '0';
  90. }
  91. let num = value.toString().split('.');
  92. let interCount = num[0].length;
  93. if (interCount < 3) {
  94. return String(value);
  95. }
  96. let index = 0;
  97. let inter = '';
  98. for (let i = interCount - 3; i >= 0; i -= 3) {
  99. inter = num[0].substr(i, 3) + (inter == '' ? '' : ',') + inter;
  100. index = i;
  101. }
  102. if (index > 0) {
  103. inter = num[0].substr(0, index) + (inter == '' ? '' : ',') + inter;
  104. }
  105. return inter + (num.length == 1 ? '' : '.' + num[1]);
  106. };
  107. /**
  108. * 密码格式化
  109. */
  110. const pwdFormat = (value: string | number | null | undefined): string => {
  111. if (value == null || value == undefined) {
  112. return 'Null';
  113. } else {
  114. let len = value.toString().length;
  115. let val = '';
  116. for (let i = 0; i < len; i++) {
  117. val = val + '*';
  118. }
  119. return val;
  120. }
  121. };
  122. /**
  123. * 数字保留指定位数小数(不四舍五入)
  124. * @param value 要格式化的数字或字符串
  125. * @param decimalPlaces 保留的小数位数,默认为2
  126. */
  127. const numberDecimal = (value: number | string, decimalPlaces: number = 2): string => {
  128. if (isNaN(Number(value)) || value === ''||value == null) {
  129. return '0.' + '0'.repeat(decimalPlaces);
  130. }
  131. const strValue = String(value);
  132. const [integerPart, decimalPart = ''] = strValue.split('.');
  133. if (!decimalPart) {
  134. return `${integerPart}.` + '0'.repeat(decimalPlaces);
  135. }
  136. const truncatedDecimalPart = decimalPart.slice(0, decimalPlaces);
  137. const paddedDecimalPart = truncatedDecimalPart.padEnd(decimalPlaces, '0');
  138. return `${integerPart}.${paddedDecimalPart}`;
  139. };
  140. /**
  141. * 数字脱敏(手机号格式)
  142. */
  143. const numberDesensitization = (value: number | string): string => {
  144. let realVal = '';
  145. if (!isNaN(Number(value)) && value !== '') {
  146. const str = value.toString();
  147. realVal = str.substr(0, 2) + '****' + str.substr(-2);
  148. } else {
  149. realVal = '--';
  150. }
  151. return realVal;
  152. };
  153. /**
  154. * 数字脱敏1(简单格式)
  155. */
  156. const numberDesensitization1 = (value: number | string): string => {
  157. const str = value.toString();
  158. return str.substr(0, 1) + '***' + str.substr(-2);
  159. };
  160. return {
  161. percentFormat,
  162. numberFormat,
  163. numberFormat1,
  164. pwdFormat,
  165. numberDecimal,
  166. numberDesensitization,
  167. numberDesensitization1
  168. };
  169. }