| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /**
- * 后端 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' }
- }
|