export function formatCurrency(value) { const number = Number(value || 0); return `¥${number.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`; } export function formatNumber(value, digits = 2) { return Number(value || 0).toLocaleString('zh-CN', { minimumFractionDigits: digits, maximumFractionDigits: digits }); } export function formatPercent(value) { const number = Number(value || 0); return `${number > 0 ? '+' : ''}${number.toFixed(2)}%`; } export function formatDateTime(value) { if (!value) return '--'; const date = new Date(value); if (Number.isNaN(date.getTime())) return String(value); return new Intl.DateTimeFormat('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false, }).format(date).replaceAll('/', '-'); } export function valueClass(value) { const number = Number(value || 0); if (number > 0) return 'value--positive'; if (number < 0) return 'value--negative'; return 'value--muted'; } export function escapeHtml(value) { const node = document.createElement('span'); node.textContent = String(value ?? ''); return node.innerHTML; }