2025-05-27 15:31:06 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* 将一个整数转换为分数保留两位小数
|
|
|
|
|
|
* @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),
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2025-06-04 20:21:20 +08:00
|
|
|
|
|
|
|
|
|
|
// ========== ERP 专属方法 ==========
|
|
|
|
|
|
|
|
|
|
|
|
const ERP_COUNT_DIGIT = 3;
|
|
|
|
|
|
const ERP_PRICE_DIGIT = 2;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 【ERP】格式化 Input 数字
|
|
|
|
|
|
*
|
|
|
|
|
|
* 例如说:库存数量
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param num 数量
|
|
|
|
|
|
* @package
|
|
|
|
|
|
* @return 格式化后的数量
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function erpNumberFormatter(
|
|
|
|
|
|
num: number | string | undefined,
|
|
|
|
|
|
digit: number,
|
|
|
|
|
|
) {
|
|
|
|
|
|
if (num === null || num === undefined) {
|
|
|
|
|
|
return '';
|
|
|
|
|
|
}
|
|
|
|
|
|
if (typeof num === 'string') {
|
|
|
|
|
|
num = Number.parseFloat(num);
|
|
|
|
|
|
}
|
|
|
|
|
|
// 如果非 number,则直接返回空串
|
|
|
|
|
|
if (Number.isNaN(num)) {
|
|
|
|
|
|
return '';
|
|
|
|
|
|
}
|
|
|
|
|
|
return num.toFixed(digit);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 【ERP】格式化数量,保留三位小数
|
|
|
|
|
|
*
|
|
|
|
|
|
* 例如说:库存数量
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param num 数量
|
|
|
|
|
|
* @return 格式化后的数量
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function erpCountInputFormatter(num: number | string | undefined) {
|
|
|
|
|
|
return erpNumberFormatter(num, ERP_COUNT_DIGIT);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// noinspection JSCommentMatchesSignature
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 【ERP】格式化数量,保留三位小数
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param cellValue 数量
|
|
|
|
|
|
* @return 格式化后的数量
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function erpCountTableColumnFormatter(cellValue: any) {
|
|
|
|
|
|
return erpNumberFormatter(cellValue, ERP_COUNT_DIGIT);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 【ERP】格式化金额,保留二位小数
|
|
|
|
|
|
*
|
|
|
|
|
|
* 例如说:库存数量
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param num 数量
|
|
|
|
|
|
* @return 格式化后的数量
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function erpPriceInputFormatter(num: number | string | undefined) {
|
|
|
|
|
|
return erpNumberFormatter(num, ERP_PRICE_DIGIT);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// noinspection JSCommentMatchesSignature
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 【ERP】格式化金额,保留二位小数
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param cellValue 数量
|
|
|
|
|
|
* @return 格式化后的数量
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function erpPriceTableColumnFormatter(cellValue: any) {
|
|
|
|
|
|
return erpNumberFormatter(cellValue, ERP_PRICE_DIGIT);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 【ERP】价格计算,四舍五入保留两位小数
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param price 价格
|
|
|
|
|
|
* @param count 数量
|
|
|
|
|
|
* @return 总价格。如果有任一为空,则返回 undefined
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function erpPriceMultiply(price: number, count: number) {
|
|
|
|
|
|
if (price === null || count === null) {
|
|
|
|
|
|
return undefined;
|
|
|
|
|
|
}
|
|
|
|
|
|
return Number.parseFloat((price * count).toFixed(ERP_PRICE_DIGIT));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 【ERP】百分比计算,四舍五入保留两位小数
|
|
|
|
|
|
*
|
|
|
|
|
|
* 如果 total 为 0,则返回 0
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param value 当前值
|
|
|
|
|
|
* @param total 总值
|
|
|
|
|
|
*/
|
|
|
|
|
|
export function erpCalculatePercentage(value: number, total: number) {
|
|
|
|
|
|
if (total === 0) return 0;
|
|
|
|
|
|
return ((value / total) * 100).toFixed(2);
|
|
|
|
|
|
}
|