37 lines
1.2 KiB
TypeScript
37 lines
1.2 KiB
TypeScript
export const MONEY_UNITS_PER_YUAN = 10_000;
|
|
|
|
export function formatAmount(value: number) {
|
|
return value.toLocaleString('zh-CN', {
|
|
minimumFractionDigits: 0,
|
|
maximumFractionDigits: 4,
|
|
});
|
|
}
|
|
|
|
export function formatRateAmount(value: number) {
|
|
return value.toLocaleString('zh-CN', { minimumFractionDigits: 4, maximumFractionDigits: 4 });
|
|
}
|
|
|
|
export function formatCents(cents?: number | null) {
|
|
return formatAmount((cents ?? 0) / MONEY_UNITS_PER_YUAN);
|
|
}
|
|
|
|
export function formatYuan(cents?: number | null) {
|
|
return `¥${formatCents(cents)}`;
|
|
}
|
|
|
|
export function yuanToMoneyUnits(value: number | string | null | undefined) {
|
|
const amount = typeof value === 'string' ? Number(value) : (value ?? 0);
|
|
return Math.round(amount * MONEY_UNITS_PER_YUAN);
|
|
}
|
|
|
|
export function isValidMoneyInput(value: string, options: { allowNegative?: boolean; allowZero?: boolean } = {}) {
|
|
const normalized = value.trim();
|
|
const pattern = options.allowNegative ? /^-?\d+(?:\.\d{1,4})?$/ : /^\d+(?:\.\d{1,4})?$/;
|
|
if (!pattern.test(normalized)) return false;
|
|
return options.allowZero !== false || Number(normalized) !== 0;
|
|
}
|
|
|
|
export function moneyUnitsToYuan(value?: number | null) {
|
|
return (value ?? 0) / MONEY_UNITS_PER_YUAN;
|
|
}
|