Files
one-api-workers/frontend/src/lib/billing.ts
T
Jeff Gu 0258367a64 feat(billing): 优化计费精度
- 新增账单配置 API,包括获取和更新显示小数位数的功能。
- 在前端页面中集成账单配置,允许用户设置金额显示精度。
- 更新相关页面(分析、定价、令牌、使用日志)以支持动态显示小数位数。
- 规范化账单金额处理,确保金额在前端和后端一致。
2026-04-13 13:56:13 +08:00

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";
};