diff --git a/apps/web-antd/src/adapter/vxe-table.ts b/apps/web-antd/src/adapter/vxe-table.ts index 127ff5d51..c4dcb2a86 100644 --- a/apps/web-antd/src/adapter/vxe-table.ts +++ b/apps/web-antd/src/adapter/vxe-table.ts @@ -283,6 +283,22 @@ setupVbenVxeTable({ return cellValue.toFixed(digits); }, }); + + vxeUI.formats.add('formatFraction', { + tableCellFormatMethod({ cellValue }) { + if (cellValue === null || cellValue === undefined) { + return '0.00'; + } + if (isString(cellValue)) { + cellValue = Number.parseFloat(cellValue); + } + // 如果非 number,则直接返回空串 + if (Number.isNaN(cellValue)) { + return '0.00'; + } + return `${(cellValue / 100).toFixed(2)}元`; + }, + }); }, useVbenForm, }); diff --git a/apps/web-antd/src/utils/formatNumber.ts b/apps/web-antd/src/utils/formatNumber.ts new file mode 100644 index 000000000..13fdab6a7 --- /dev/null +++ b/apps/web-antd/src/utils/formatNumber.ts @@ -0,0 +1,82 @@ +/** + * 将一个整数转换为分数保留两位小数 + * @param num + */ +export function formatToFraction(num: number | string | undefined): string { + if (num === undefined) return '0.00'; + const parsedNumber = typeof num === 'string' ? Number.parseFloat(num) : num; + return (parsedNumber / 100).toFixed(2); +} + +/** + * 将一个数转换为 1.00 这样 + * 数据呈现的时候使用 + * + * @param num 整数 + */ +export function floatToFixed2(num: number | string | undefined): string { + let str = '0.00'; + if (num === undefined) { + return str; + } + const f = formatToFraction(num); + const decimalPart = f.toString().split('.')[1]; + const len = decimalPart ? decimalPart.length : 0; + switch (len) { + case 0: { + str = `${f.toString()}.00`; + break; + } + case 1: { + str = `${f.toString()}0`; + break; + } + case 2: { + str = f.toString(); + break; + } + } + return str; +} + +/** + * 将一个分数转换为整数 + * @param num + */ +export function convertToInteger(num: number | string | undefined): number { + if (num === undefined) return 0; + const parsedNumber = typeof num === 'string' ? Number.parseFloat(num) : num; + return Math.round(parsedNumber * 100); +} + +/** + * 元转分 + */ +export function yuanToFen(amount: number | string): number { + return convertToInteger(amount); +} + +/** + * 分转元 + */ +export function fenToYuan(price: number | string): string { + return formatToFraction(price); +} + +/** + * 计算环比 + * + * @param value 当前数值 + * @param reference 对比数值 + */ +export function calculateRelativeRate( + value?: number, + reference?: number, +): number { + // 防止除0 + if (!reference || reference === 0) return 0; + + return Number.parseFloat( + ((100 * ((value || 0) - reference)) / reference).toFixed(0), + ); +} diff --git a/apps/web-antd/src/utils/index.ts b/apps/web-antd/src/utils/index.ts index 101e381e5..479a35472 100644 --- a/apps/web-antd/src/utils/index.ts +++ b/apps/web-antd/src/utils/index.ts @@ -1,6 +1,7 @@ export * from './constants'; export * from './dict'; export * from './download'; +export * from './formatNumber'; export * from './formatTime'; export * from './formCreate'; export * from './rangePickerProps';