format.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /**
  2. * 后端 videoDetail 字段值都是 string,需要前端按用途格式化
  3. * 缺值/非数值统一返回 "--" 占位
  4. */
  5. const PLACEHOLDER = '--'
  6. /** 比率值 (rov/str/ros/vov0/vov1) → 取 4 位小数;非数值返回 -- */
  7. export function formatRatio(s: string | undefined | null): string {
  8. if (s == null || s === '' || s === PLACEHOLDER) return PLACEHOLDER
  9. const n = Number(s)
  10. if (!Number.isFinite(n)) return PLACEHOLDER
  11. return n.toFixed(4)
  12. }
  13. /** 量级数值 → K/M 缩写 (614275 → 614.3K, 1925000 → 1.93M) */
  14. export function formatCount(s: string | undefined | null): string {
  15. if (s == null || s === '' || s === PLACEHOLDER) return PLACEHOLDER
  16. const n = Number(s)
  17. if (!Number.isFinite(n)) return PLACEHOLDER
  18. if (n >= 1_000_000) return (n / 1_000_000).toFixed(2) + 'M'
  19. if (n >= 10_000) return (n / 1000).toFixed(1) + 'K'
  20. if (n >= 1000) return (n / 1000).toFixed(2) + 'K'
  21. return String(n)
  22. }
  23. /** "20250622" → "2025-06-22"; 形态不对返回原值或 -- */
  24. export function formatDate(s: string | undefined | null): string {
  25. if (!s) return PLACEHOLDER
  26. if (/^\d{8}$/.test(s)) return `${s.slice(0, 4)}-${s.slice(4, 6)}-${s.slice(6, 8)}`
  27. return s
  28. }
  29. /** 视频时长秒 → "3 分 10 秒" 或 "190s"(后端给的是 "190.0") */
  30. export function formatDuration(s: string | undefined | null): string {
  31. if (!s) return PLACEHOLDER
  32. const n = Number(s)
  33. if (!Number.isFinite(n) || n <= 0) return PLACEHOLDER
  34. const sec = Math.round(n)
  35. if (sec < 60) return `${sec}s`
  36. const m = Math.floor(sec / 60)
  37. const r = sec % 60
  38. return r === 0 ? `${m}分` : `${m}分${r}秒`
  39. }
  40. /**
  41. * 拆分形如 "老年生活:45123,通用老年:45419" 的标签串,
  42. * 冒号后的 ID 丢弃,只保留中文名;空串/空值返回 []
  43. */
  44. export function splitTags(s: string | undefined | null): string[] {
  45. if (!s) return []
  46. return s
  47. .split(',')
  48. .map((part) => part.split(':')[0].trim())
  49. .filter(Boolean)
  50. }
  51. /** 相似度配色(按分数走 4 档) */
  52. export function getScoreStyle(score: number | null | undefined) {
  53. if (score == null) {
  54. return { bg: '#fafafa', border: '#e8e8e8', text: 'rgba(0,0,0,0.45)' }
  55. }
  56. if (score >= 0.85) return { bg: '#f6ffed', border: '#b7eb8f', text: '#389e0d' }
  57. if (score >= 0.75) return { bg: '#fcffe6', border: '#eaff8f', text: '#7cb305' }
  58. if (score >= 0.65) return { bg: '#fff7e6', border: '#ffd591', text: '#d46b08' }
  59. return { bg: '#fff1f0', border: '#ffa39e', text: '#cf1322' }
  60. }