import dayjs from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime'; import 'dayjs/locale/zh-cn'; // 配置 dayjs dayjs.extend(relativeTime); dayjs.locale('zh-cn'); /** * 格式化数字,添加千位分隔符 */ export function formatNumber(num: number | string, decimals = 0): string { const n = typeof num === 'string' ? parseFloat(num) : num; if (isNaN(n)) return '0'; return n.toLocaleString('zh-CN', { minimumFractionDigits: decimals, maximumFractionDigits: decimals, }); } /** * 格式化货币 */ export function formatCurrency(amount: number, currency = 'CNY'): string { const symbols: Record = { CNY: '¥', USD: '$', USDT: '积分 ', BTC: 'BTC ', }; const symbol = symbols[currency] || ''; return `${symbol}${formatNumber(amount, 2)}`; } /** * 格式化百分比 */ export function formatPercentage(value: number, decimals = 1): string { return `${value >= 0 ? '+' : ''}${value.toFixed(decimals)}%`; } /** * 格式化日期 * dayjs 会自动将 UTC 时间转换为本地时间显示 */ export function formatDate(date: string | Date, format = 'YYYY-MM-DD'): string { return dayjs(date).format(format); } /** * 格式化日期时间 * dayjs 会自动将 UTC 时间转换为本地时间显示 */ export function formatDateTime(date: string | Date, format = 'YYYY-MM-DD HH:mm:ss'): string { return dayjs(date).format(format); } /** * 格式化相对时间 (如: 5分钟前, 2小时前) * dayjs 会自动将 UTC 时间转换为本地时间计算 */ export function formatRelativeTime(date: string | Date): string { return dayjs(date).fromNow(); } /** * 格式化文件大小 */ export function formatFileSize(bytes: number): string { if (bytes === 0) return '0 B'; const k = 1024; const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`; } /** * 截断文本 */ export function truncateText(text: string, maxLength: number): string { if (text.length <= maxLength) return text; return `${text.slice(0, maxLength)}...`; } /** * 格式化手机号 (隐藏中间4位) */ export function formatPhone(phone: string): string { if (!phone || phone.length !== 11) return phone; return `${phone.slice(0, 3)}****${phone.slice(7)}`; } /** * 格式化钱包地址 (显示前后几位) */ export function formatWalletAddress(address: string, startLen = 6, endLen = 4): string { if (!address || address.length <= startLen + endLen) return address; return `${address.slice(0, startLen)}...${address.slice(-endLen)}`; } /** * 格式化排名显示 */ export function formatRanking(rank: number | null): string { if (rank === null || rank === 0) return '-'; return `#${rank}`; }