| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- /**
- * 金额格式化工具
- * 后端统一使用整型(分)存储金额,前端在此转换展示
- */
- /**
- * 分 → 元,保留2位小数
- * @param {number|null} cents 金额(分)
- * @returns {string|null} "12.50" 或 null
- */
- export function formatPrice(cents) {
- if (cents == null || cents === undefined) return null
- return (cents / 100).toFixed(2)
- }
- /**
- * 分 → 元,带 ¥ 前缀
- * @param {number|null} cents 金额(分)
- * @returns {string} "¥12.50" 或 "登录查看"
- */
- export function formatPriceWithSymbol(cents) {
- if (cents == null || cents === undefined) return '登录查看'
- return '¥' + (cents / 100).toFixed(2)
- }
- /**
- * 千分比 → 百分比字符串
- * @param {number|null} permillage 千分比(235 = 23.5%)
- * @returns {string} "23.5%" 或 "--"
- */
- export function formatRate(permillage) {
- if (permillage == null || permillage === undefined) return '--'
- return (permillage / 10) + '%'
- }
- /**
- * 百分制评分 → 展示值
- * @param {number|null} value 百分制(450 = 4.5分)
- * @param {number} fixed 小数位数
- * @returns {string} "4.5" 或 "--"
- */
- export function formatScore(value, fixed) {
- if (fixed === undefined) fixed = 1
- if (value == null || value === undefined) return '--'
- return (value / 100).toFixed(fixed)
- }
- /**
- * iOS 安全日期解析(微信小程序专用)
- *
- * 部分 iOS(JavaScriptCore)的 `new Date(string)` 只支持以下格式:
- * yyyy/MM/dd、yyyy/MM/dd HH:mm:ss、yyyy-MM-dd、
- * yyyy-MM-ddTHH:mm:ss、yyyy-MM-ddTHH:mm:ss+HH:mm
- *
- * 后端常见的 "yyyy-MM-dd HH:mm"(空格分隔,MySQL DATETIME 风格)
- * 以及 Java 的 "Sat Aug 22 14:00:00 CST 2026" 在 iOS 下会解析失败
- * 返回 Invalid Date。所有日期字符串解析必须经此函数,禁止直接 new Date(str)。
- *
- * @param {string|number|Date} str 日期字符串、时间戳或 Date 对象
- * @returns {Date|null} 解析失败返回 null
- */
- export function parseDate(str) {
- if (str === null || str === undefined || str === '') return null
- // 已是 Date 对象或时间戳,直接使用
- if (typeof str === 'number') {
- var dNum = new Date(str)
- return isNaN(dNum.getTime()) ? null : dNum
- }
- if (typeof str === 'object' && str.getTime) return str
- // Java 格式: "Sat Aug 22 14:00:00 CST 2026" — iOS 不支持,手动归一化
- var javaRe = /^\w{3}\s+(\w{3})\s+(\d{1,2})\s+(\d{2}:\d{2}:\d{2})\s+\w{3}\s+(\d{4})$/
- var m = String(str).match(javaRe)
- if (m) {
- 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'}
- var jDay = m[2].length === 1 ? '0' + m[2] : m[2]
- return new Date(m[4] + '/' + (months[m[1]] || '01') + '/' + jDay + ' ' + m[3])
- }
- var s = String(str)
- // MySQL DATETIME 风格 "yyyy-MM-dd HH:mm[:ss]"(或 "/" 分隔的 "yyyy/MM/dd HH:mm"):
- // 空格分隔格式 iOS 不支持,统一归一化为 iOS 支持的 "yyyy/MM/dd HH:mm:ss"
- var spaceDtRe = /^(\d{4})[/-](\d{2})[/-](\d{2}) (\d{2}:\d{2})(:\d{2})?$/
- var sm = s.match(spaceDtRe)
- if (sm) {
- s = sm[1] + '/' + sm[2] + '/' + sm[3] + ' ' + sm[4] + (sm[5] || ':00')
- }
- // 其余标准格式原样解析(iOS 支持 yyyy/MM/dd、yyyy-MM-dd、ISO 8601 等)
- var d = new Date(s)
- return isNaN(d.getTime()) ? null : d
- }
|