37 lines
1.5 KiB
TypeScript
37 lines
1.5 KiB
TypeScript
/**
|
|
* 将整数部分按每 4 位分组,适用于中文金额展示。
|
|
* 例如:999999.99 -> 99,9999.99。
|
|
*/
|
|
export function formatWanInteger(value: number | string): string {
|
|
const text = String(value).trim();
|
|
const negative = text.startsWith("-");
|
|
const integerText = (negative || text.startsWith("+")) ? text.slice(1) : text;
|
|
const normalizedText = integerText.replace(/^0+(?=\d)/, "") || "0";
|
|
const groupedText = normalizedText.replace(/\B(?=(\d{4})+(?!\d))/g, ",");
|
|
return `${negative ? "-" : ""}${groupedText}`;
|
|
}
|
|
|
|
/** 将整数分转换为带两位小数的金额展示文本。 */
|
|
export function formatCentsAmount(cents?: number | null): string {
|
|
if (cents === undefined || cents === null || !Number.isFinite(cents)) {
|
|
return "未设置";
|
|
}
|
|
|
|
const negative = cents < 0;
|
|
const absolute = Math.abs(Math.trunc(cents));
|
|
const yuan = Math.floor(absolute / 100);
|
|
const fen = String(absolute % 100).padStart(2, "0");
|
|
return `${negative ? "-" : ""}${formatWanInteger(yuan)}.${fen}`;
|
|
}
|
|
|
|
/** 将元金额转换为按每 4 位分组的展示文本,最多保留两位小数。 */
|
|
export function formatYuanAmount(value?: number | null): string {
|
|
if (value === undefined || value === null || !Number.isFinite(value)) {
|
|
return "0";
|
|
}
|
|
|
|
const [integerText, fractionText = ""] = value.toFixed(2).split(".");
|
|
const normalizedFractionText = fractionText.replace(/0+$/, "");
|
|
return `${formatWanInteger(integerText)}${normalizedFractionText ? `.${normalizedFractionText}` : ""}`;
|
|
}
|