/** * 货币工具函数 */ import type { CurrencyCode } from '@/types/portfolio'; const CURRENCY_SYMBOLS: Record = { 'CNY': '¥', 'USD': '$', 'HKD': 'HK$', 'EUR': '€', 'GBP': '£', 'JPY': '¥', 'SGD': 'S$', 'AUD': 'A$' }; /** * 获取货币符号 * @param currency - 货币代码 (CNY, USD, HKD 等) * @returns 货币符号 */ export function getCurrencySymbol(currency?: string): string { return CURRENCY_SYMBOLS[currency?.toUpperCase() ?? 'CNY'] || '¥'; } /** * 格式化金额 * @param amount - 金额 * @param currency - 货币代码 * @param decimals - 小数位数 * @returns 格式化后的金额字符串 */ export function formatAmount( amount: number, currency: CurrencyCode | string = 'CNY', decimals: number = 2 ): string { const symbol = getCurrencySymbol(currency); const formatted = Math.abs(amount || 0).toLocaleString('zh-CN', { minimumFractionDigits: decimals, maximumFractionDigits: decimals }); const sign = amount >= 0 ? '' : '-'; return `${sign}${symbol}${formatted}`; } /** * 格式化金额(带正负号) * @param amount - 金额 * @param currency - 货币代码 * @param decimals - 小数位数 * @returns 格式化后的金额字符串 */ export function formatAmountWithSign( amount: number, currency: CurrencyCode | string = 'CNY', decimals: number = 2 ): string { const symbol = getCurrencySymbol(currency); const formatted = Math.abs(amount || 0).toLocaleString('zh-CN', { minimumFractionDigits: decimals, maximumFractionDigits: decimals }); if (amount > 0) return `+${symbol}${formatted}`; if (amount < 0) return `-${symbol}${formatted}`; return `${symbol}${formatted}`; }