66 lines
2.0 KiB
TypeScript
66 lines
2.0 KiB
TypeScript
/**
|
||
* 金额 / 计数 / 百分比格式化工具
|
||
* 规范:docs/miniprogram-dev/design-system/DISPLAY-STANDARDS.md
|
||
*/
|
||
|
||
/**
|
||
* 金额格式化
|
||
* ¥12,680 / -¥368 / ¥0 / --
|
||
* @param value 金额(元,整数)
|
||
*/
|
||
export function formatMoney(value: number | null | undefined): string {
|
||
if (value === null || value === undefined) return '--'
|
||
if (value === 0) return '¥0'
|
||
const abs = Math.round(Math.abs(value))
|
||
const formatted = abs.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')
|
||
return value < 0 ? `-¥${formatted}` : `¥${formatted}`
|
||
}
|
||
|
||
/**
|
||
* 计数格式化(带单位)
|
||
* 零值返回 '--';≥1000 加千分位
|
||
* @param value 数值
|
||
* @param unit 单位字符串,如 '笔' '次' '人'
|
||
*/
|
||
export function formatCount(
|
||
value: number | null | undefined,
|
||
unit: string,
|
||
): string {
|
||
if (value === null || value === undefined || value === 0) return '--'
|
||
const n =
|
||
value >= 1000
|
||
? value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')
|
||
: String(value)
|
||
return `${n}${unit}`
|
||
}
|
||
|
||
/**
|
||
* 纯数字千分位格式化(无单位,用于非金额大数字)
|
||
* 零值返回 '--'
|
||
*/
|
||
export function formatNumber(value: number | null | undefined): string {
|
||
if (value === null || value === undefined || value === 0) return '--'
|
||
return value >= 1000
|
||
? value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')
|
||
: String(value)
|
||
}
|
||
|
||
/**
|
||
* 百分比展示(允许超过100%)
|
||
* 保留1位小数;零值返回 '0%';空值返回 '--'
|
||
*/
|
||
export function formatPercent(value: number | null | undefined): string {
|
||
if (value === null || value === undefined) return '--'
|
||
if (value === 0) return '0%'
|
||
return `${value.toFixed(1)}%`
|
||
}
|
||
|
||
/**
|
||
* 进度条 CSS 宽度字符串(截断至 [0, 100],防止溢出)
|
||
* 用法:style="width: {{toProgressWidth(perfData.filledPct)}}"
|
||
*/
|
||
export function toProgressWidth(value: number | null | undefined): string {
|
||
if (value === null || value === undefined) return '0%'
|
||
return `${Math.min(100, Math.max(0, value)).toFixed(1)}%`
|
||
}
|