/** * 后端 videoDetail 字段值都是 string,需要前端按用途格式化 * 缺值/非数值统一返回 "--" 占位 */ const PLACEHOLDER = '--' /** 比率值 (rov/str/ros/vov0/vov1) → 取 4 位小数;非数值返回 -- */ export function formatRatio(s: string | undefined | null): string { if (s == null || s === '' || s === PLACEHOLDER) return PLACEHOLDER const n = Number(s) if (!Number.isFinite(n)) return PLACEHOLDER return n.toFixed(4) } /** 量级数值 → K/M 缩写 (614275 → 614.3K, 1925000 → 1.93M) */ export function formatCount(s: string | undefined | null): string { if (s == null || s === '' || s === PLACEHOLDER) return PLACEHOLDER const n = Number(s) if (!Number.isFinite(n)) return PLACEHOLDER if (n >= 1_000_000) return (n / 1_000_000).toFixed(2) + 'M' if (n >= 10_000) return (n / 1000).toFixed(1) + 'K' if (n >= 1000) return (n / 1000).toFixed(2) + 'K' return String(n) } /** "20250622" → "2025-06-22"; 形态不对返回原值或 -- */ export function formatDate(s: string | undefined | null): string { if (!s) return PLACEHOLDER if (/^\d{8}$/.test(s)) return `${s.slice(0, 4)}-${s.slice(4, 6)}-${s.slice(6, 8)}` return s } /** 视频时长秒 → "3 分 10 秒" 或 "190s"(后端给的是 "190.0") */ export function formatDuration(s: string | undefined | null): string { if (!s) return PLACEHOLDER const n = Number(s) if (!Number.isFinite(n) || n <= 0) return PLACEHOLDER const sec = Math.round(n) if (sec < 60) return `${sec}s` const m = Math.floor(sec / 60) const r = sec % 60 return r === 0 ? `${m}分` : `${m}分${r}秒` } /** * 拆分形如 "老年生活:45123,通用老年:45419" 的标签串, * 冒号后的 ID 丢弃,只保留中文名;空串/空值返回 [] */ export function splitTags(s: string | undefined | null): string[] { if (!s) return [] return s .split(',') .map((part) => part.split(':')[0].trim()) .filter(Boolean) } /** 相似度配色(按分数走 4 档) */ export function getScoreStyle(score: number | null | undefined) { if (score == null) { return { bg: '#fafafa', border: '#e8e8e8', text: 'rgba(0,0,0,0.45)' } } if (score >= 0.85) return { bg: '#f6ffed', border: '#b7eb8f', text: '#389e0d' } if (score >= 0.75) return { bg: '#fcffe6', border: '#eaff8f', text: '#7cb305' } if (score >= 0.65) return { bg: '#fff7e6', border: '#ffd591', text: '#d46b08' } return { bg: '#fff1f0', border: '#ffa39e', text: '#cf1322' } }