format.js 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /**
  2. * 金额格式化工具
  3. * 后端统一使用整型(分)存储金额,前端在此转换展示
  4. */
  5. /**
  6. * 分 → 元,保留2位小数
  7. * @param {number|null} cents 金额(分)
  8. * @returns {string|null} "12.50" 或 null
  9. */
  10. export function formatPrice(cents) {
  11. if (cents == null || cents === undefined) return null
  12. return (cents / 100).toFixed(2)
  13. }
  14. /**
  15. * 分 → 元,带 ¥ 前缀
  16. * @param {number|null} cents 金额(分)
  17. * @returns {string} "¥12.50" 或 "登录查看"
  18. */
  19. export function formatPriceWithSymbol(cents) {
  20. if (cents == null || cents === undefined) return '登录查看'
  21. return '¥' + (cents / 100).toFixed(2)
  22. }
  23. /**
  24. * 千分比 → 百分比字符串
  25. * @param {number|null} permillage 千分比(235 = 23.5%)
  26. * @returns {string} "23.5%" 或 "--"
  27. */
  28. export function formatRate(permillage) {
  29. if (permillage == null || permillage === undefined) return '--'
  30. return (permillage / 10) + '%'
  31. }
  32. /**
  33. * 百分制评分 → 展示值
  34. * @param {number|null} value 百分制(450 = 4.5分)
  35. * @param {number} fixed 小数位数
  36. * @returns {string} "4.5" 或 "--"
  37. */
  38. export function formatScore(value, fixed) {
  39. if (fixed === undefined) fixed = 1
  40. if (value == null || value === undefined) return '--'
  41. return (value / 100).toFixed(fixed)
  42. }
  43. /**
  44. * iOS 安全日期解析(微信小程序专用)
  45. *
  46. * 部分 iOS(JavaScriptCore)的 `new Date(string)` 只支持以下格式:
  47. * yyyy/MM/dd、yyyy/MM/dd HH:mm:ss、yyyy-MM-dd、
  48. * yyyy-MM-ddTHH:mm:ss、yyyy-MM-ddTHH:mm:ss+HH:mm
  49. *
  50. * 后端常见的 "yyyy-MM-dd HH:mm"(空格分隔,MySQL DATETIME 风格)
  51. * 以及 Java 的 "Sat Aug 22 14:00:00 CST 2026" 在 iOS 下会解析失败
  52. * 返回 Invalid Date。所有日期字符串解析必须经此函数,禁止直接 new Date(str)。
  53. *
  54. * @param {string|number|Date} str 日期字符串、时间戳或 Date 对象
  55. * @returns {Date|null} 解析失败返回 null
  56. */
  57. export function parseDate(str) {
  58. if (str === null || str === undefined || str === '') return null
  59. // 已是 Date 对象或时间戳,直接使用
  60. if (typeof str === 'number') {
  61. var dNum = new Date(str)
  62. return isNaN(dNum.getTime()) ? null : dNum
  63. }
  64. if (typeof str === 'object' && str.getTime) return str
  65. // Java 格式: "Sat Aug 22 14:00:00 CST 2026" — iOS 不支持,手动归一化
  66. var javaRe = /^\w{3}\s+(\w{3})\s+(\d{1,2})\s+(\d{2}:\d{2}:\d{2})\s+\w{3}\s+(\d{4})$/
  67. var m = String(str).match(javaRe)
  68. if (m) {
  69. var months = {Jan:'01',Feb:'02',Mar:'03',Apr:'04',May:'05',Jun:'06',Jul:'07',Aug:'08',Sep:'09',Oct:'10',Nov:'11',Dec:'12'}
  70. var jDay = m[2].length === 1 ? '0' + m[2] : m[2]
  71. return new Date(m[4] + '/' + (months[m[1]] || '01') + '/' + jDay + ' ' + m[3])
  72. }
  73. var s = String(str)
  74. // MySQL DATETIME 风格 "yyyy-MM-dd HH:mm[:ss]"(或 "/" 分隔的 "yyyy/MM/dd HH:mm"):
  75. // 空格分隔格式 iOS 不支持,统一归一化为 iOS 支持的 "yyyy/MM/dd HH:mm:ss"
  76. var spaceDtRe = /^(\d{4})[/-](\d{2})[/-](\d{2}) (\d{2}:\d{2})(:\d{2})?$/
  77. var sm = s.match(spaceDtRe)
  78. if (sm) {
  79. s = sm[1] + '/' + sm[2] + '/' + sm[3] + ' ' + sm[4] + (sm[5] || ':00')
  80. }
  81. // 其余标准格式原样解析(iOS 支持 yyyy/MM/dd、yyyy-MM-dd、ISO 8601 等)
  82. var d = new Date(s)
  83. return isNaN(d.getTime()) ? null : d
  84. }