- 新增账单配置 API,包括获取和更新显示小数位数的功能。 - 在前端页面中集成账单配置,允许用户设置金额显示精度。 - 更新相关页面(分析、定价、令牌、使用日志)以支持动态显示小数位数。 - 规范化账单金额处理,确保金额在前端和后端一致。
44 lines
1.5 KiB
TypeScript
44 lines
1.5 KiB
TypeScript
import { BillingConfig } from "@/types";
|
|
|
|
export const BILLING_RAW_SCALE = 1_000_000_000;
|
|
export const DEFAULT_BILLING_DISPLAY_DECIMALS = 6;
|
|
export const MIN_BILLING_DISPLAY_DECIMALS = 0;
|
|
export const MAX_BILLING_DISPLAY_DECIMALS = 9;
|
|
|
|
const trimTrailingZeros = (value: string): string => {
|
|
return value.replace(/(\.\d*?[1-9])0+$/u, "$1").replace(/\.0+$/u, "").replace(/\.$/u, "");
|
|
};
|
|
|
|
export const normalizeBillingDisplayDecimals = (value: unknown): number => {
|
|
const parsed = typeof value === "number" && Number.isFinite(value)
|
|
? Math.round(value)
|
|
: DEFAULT_BILLING_DISPLAY_DECIMALS;
|
|
|
|
return Math.min(MAX_BILLING_DISPLAY_DECIMALS, Math.max(MIN_BILLING_DISPLAY_DECIMALS, parsed));
|
|
};
|
|
|
|
export const normalizeBillingConfig = (value?: Partial<BillingConfig> | null): BillingConfig => {
|
|
return {
|
|
displayDecimals: normalizeBillingDisplayDecimals(value?.displayDecimals),
|
|
};
|
|
};
|
|
|
|
export const rawBillingToUsd = (value: number): number => {
|
|
return Number.isFinite(value) ? value / BILLING_RAW_SCALE : 0;
|
|
};
|
|
|
|
export const usdToRawBilling = (value: string | number): number => {
|
|
const parsed = typeof value === "number" ? value : Number(value);
|
|
if (!Number.isFinite(parsed)) {
|
|
return 0;
|
|
}
|
|
|
|
return Math.max(0, Math.round(parsed * BILLING_RAW_SCALE));
|
|
};
|
|
|
|
export const formatRawBillingInput = (value: number, displayDecimals = DEFAULT_BILLING_DISPLAY_DECIMALS): string => {
|
|
const decimals = normalizeBillingDisplayDecimals(displayDecimals);
|
|
const formatted = rawBillingToUsd(value).toFixed(decimals);
|
|
return trimTrailingZeros(formatted) || "0";
|
|
};
|