useFilters.ts 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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. console.log(value1)
  45. if (value1.indexOf('-') > -1) {
  46. value1 = value1.split('-')[1];
  47. let num = value1.split('.');
  48. let interCount = num[0].length;
  49. if (interCount < 3) {
  50. return numberDecimal(value,decimalPlaces);
  51. }
  52. let index = 0;
  53. let inter = '';
  54. for (let i = interCount - 3; i >= 0; i -= 3) {
  55. inter = num[0].substr(i, 3) + (inter == '' ? '' : ',') + inter;
  56. index = i;
  57. }
  58. if (index > 0) {
  59. inter = num[0].substr(0, index) + (inter == '' ? '' : ',') + inter;
  60. }
  61. // return toArray ? ['-' + inter,num[1]] : '-' + inter + (num.length == 1 ? '' : '.' + num[1]);
  62. return '-' + inter + (num.length == 1 ? '' : '.' + num[1]);
  63. } else {
  64. let num = value1.split('.');
  65. let interCount = num[0].length;
  66. if (interCount < 3) {
  67. return numberDecimal(value,decimalPlaces);
  68. }
  69. let index = 0;
  70. let inter = '';
  71. for (let i = interCount - 3; i >= 0; i -= 3) {
  72. inter = num[0].substr(i, 3) + (inter == '' ? '' : ',') + inter;
  73. index = i;
  74. }
  75. if (index > 0) {
  76. inter = num[0].substr(0, index) + (inter == '' ? '' : ',') + inter;
  77. }
  78. // return toArray ? [inter,num[1]] : inter + (num.length == 1 ? '' : '.' + num[1]);
  79. return inter + (num.length == 1 ? '' : '.' + num[1]);
  80. }
  81. };
  82. /**
  83. * 数字千分位格式化(简单版)
  84. */
  85. const numberFormat1 = (value: number | string): string => {
  86. if (value == '--') {
  87. return '--';
  88. }
  89. if (isNaN(Number(value))) {
  90. return '0';
  91. }
  92. let num = value.toString().split('.');
  93. let interCount = num[0].length;
  94. if (interCount < 3) {
  95. return String(value);
  96. }
  97. let index = 0;
  98. let inter = '';
  99. for (let i = interCount - 3; i >= 0; i -= 3) {
  100. inter = num[0].substr(i, 3) + (inter == '' ? '' : ',') + inter;
  101. index = i;
  102. }
  103. if (index > 0) {
  104. inter = num[0].substr(0, index) + (inter == '' ? '' : ',') + inter;
  105. }
  106. return inter + (num.length == 1 ? '' : '.' + num[1]);
  107. };
  108. /**
  109. * 密码格式化
  110. */
  111. const pwdFormat = (value: string | number | null | undefined): string => {
  112. if (value == null || value == undefined) {
  113. return 'Null';
  114. } else {
  115. let len = value.toString().length;
  116. let val = '';
  117. for (let i = 0; i < len; i++) {
  118. val = val + '*';
  119. }
  120. return val;
  121. }
  122. };
  123. /**
  124. * 数字保留指定位数小数(不四舍五入)
  125. * @param value 要格式化的数字或字符串
  126. * @param decimalPlaces 保留的小数位数,默认为2
  127. */
  128. const numberDecimal = (value: number | string, decimalPlaces: number = 2): string => {
  129. if (isNaN(Number(value)) || value === ''||value == null) {
  130. return '0.' + '0'.repeat(decimalPlaces);
  131. }
  132. const strValue = String(value);
  133. const [integerPart, decimalPart = ''] = strValue.split('.');
  134. if (!decimalPart) {
  135. return `${integerPart}.` + '0'.repeat(decimalPlaces);
  136. }
  137. const truncatedDecimalPart = decimalPart.slice(0, decimalPlaces);
  138. const paddedDecimalPart = truncatedDecimalPart.padEnd(decimalPlaces, '0');
  139. return `${integerPart}.${paddedDecimalPart}`;
  140. };
  141. /**
  142. * 数字脱敏(手机号格式)
  143. */
  144. const numberDesensitization = (value: number | string): string => {
  145. let realVal = '';
  146. if (!isNaN(Number(value)) && value !== '') {
  147. const str = value.toString();
  148. realVal = str.substr(0, 2) + '****' + str.substr(-2);
  149. } else {
  150. realVal = '--';
  151. }
  152. return realVal;
  153. };
  154. /**
  155. * 数字脱敏1(简单格式)
  156. */
  157. const numberDesensitization1 = (value: number | string): string => {
  158. const str = value.toString();
  159. return str.substr(0, 1) + '***' + str.substr(-2);
  160. };
  161. return {
  162. percentFormat,
  163. numberFormat,
  164. numberFormat1,
  165. pwdFormat,
  166. numberDecimal,
  167. numberDesensitization,
  168. numberDesensitization1
  169. };
  170. }