format.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /**
  2. * 金额单位转换:元 -> 万元
  3. * @param val 原始金额(元)
  4. * @param digit 保留小数位数,默认为 2
  5. * @returns 转换后的字符串(万元)
  6. */
  7. export const formatAmount = (val: any, digit: number = 2) => {
  8. if (val === undefined || val === null || val === '') return '0.00';
  9. const num = Number(val);
  10. if (isNaN(num)) return '0.00';
  11. return (num / 10000).toFixed(digit);
  12. };
  13. /**
  14. * 金额千分位格式化
  15. * @param val 原始金额
  16. * @param digit 保留小数位数
  17. * @returns 格式化后的字符串 (如: 1,234.56)
  18. */
  19. export const formatWithComma = (val: any, digit: number = 2) => {
  20. if (val === undefined || val === null || val === '') return '0.00';
  21. const num = Number(val);
  22. if (isNaN(num)) return '0.00';
  23. const options = {
  24. minimumFractionDigits: digit,
  25. maximumFractionDigits: digit,
  26. };
  27. return num.toLocaleString('en-US', options);
  28. };
  29. /**
  30. * 限制输入正数且最多两位小数的格式化工具
  31. * 常用于 uv-input 的 formatter 属性
  32. * @param val 输入字符串
  33. * @returns 格式化后的字符串
  34. */
  35. export const amountInputFormatter = (val: string) => {
  36. if (!val) return '';
  37. // 1. 仅保留数字和小数点
  38. let formatted = val.replace(/[^\d.]/g, '');
  39. // 2. 保证只有一个小数点
  40. const dotIndex = formatted.indexOf('.');
  41. if (dotIndex !== -1) {
  42. const mainPart = formatted.substring(0, dotIndex);
  43. let decimalPart = formatted.substring(dotIndex + 1).replace(/\./g, ''); // 移除多余小数点
  44. // 3. 限制两位小数
  45. if (decimalPart.length > 2) {
  46. decimalPart = decimalPart.substring(0, 2);
  47. }
  48. formatted = `${mainPart}.${decimalPart}`;
  49. }
  50. return formatted;
  51. };