# P8→NS1/RNS1 缺失项 #14：财务看板数字的格式化规范

## 简要结论
- 状态：✅ 已解决
- 风险等级：🟡 低
- 千分位、小数位、货币符号的格式化规范已在设计文档中定义，工具函数已实现（TS + WXS 双版本），财务看板已使用

## 详细审查

### 审查范围
- `docs/miniprogram-dev/design-system/DISPLAY-STANDARDS.md`
- `apps/miniprogram/miniprogram/utils/money.ts`
- `apps/miniprogram/miniprogram/utils/format.wxs`
- `apps/miniprogram/miniprogram/pages/board-finance/board-finance.ts`
- `apps/miniprogram/miniprogram/pages/board-coach/board-coach.ts`

### 发现

#### 1. 设计规范文档已完善
`DISPLAY-STANDARDS.md` 第 1 章"金额展示规范"明确定义了：
- 正常金额：`¥N,NNN`（千分位逗号，无小数）
- 负数金额：`-¥N,NNN`（负号在 ¥ 前）
- 零值：`¥0`
- 空值：`--`
- 大额金额：不简写，保留完整数字
- 禁止事项：禁止 `¥-368`、`¥0.00`、`¥12万`、`toLocaleString()`

#### 2. TS 工具函数已实现（`utils/money.ts`）
- `formatMoney(value)` — 金额格式化，千分位 + ¥ 前缀
- `formatCount(value, unit)` — 计数格式化，千分位 + 单位
- `formatNumber(value)` — 纯数字千分位
- `formatPercent(value)` — 百分比，保留 1 位小数
- `formatTrendValue(value)` — 同比/环比差值，+¥/-¥ 前缀
- `toProgressWidth(value)` — 进度条宽度，截断至 [0, 100]

#### 3. WXS 工具函数已实现（`utils/format.wxs`）
- `money(value)` — 金额格式化（WXS 版，用于 WXML 模板）
- `count(value, unit)` — 计数格式化
- `percent(value)` — 百分比
- `hours(value)` — 课时格式化
- `trendValue(value)` — 同比/环比差值
- `safe(val)` — 空值兜底

#### 4. 看板页面已使用格式化函数
- `board-finance.ts`：导入并使用 `formatMoney` 格式化赠送卡矩阵数据
- `board-coach.ts`：导入并使用 `formatMoney`、`formatCount`、`formatHours` 格式化助教数据
- `board-finance.wxml`：未引入 `format.wxs`（财务看板数据在 TS 层预格式化后传入模板）
- `board-customer.wxml`：引入 `format.wxs`，使用 `fmt.safe()` 兜底

### 证据

DISPLAY-STANDARDS.md 金额规范：
```markdown
| 场景 | 格式 | 示例 |
|---|---|---|
| 正常金额 | `¥N,NNN`（千分位逗号，无小数） | `¥12,680` |
| 负数金额 | `-¥N,NNN`（负号在 ¥ 前） | `-¥368` |
| 零值 | `¥0` | `¥0` |
| 空值 / undefined | `--` | `--` |
```

money.ts 核心函数：
```typescript
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}`
}
```

format.wxs 金额函数（WXS 版，逻辑一致）：
```javascript
function money(value) {
  if (value === undefined || value === null) return '--'
  if (value === 0) return '¥0'
  // ... 千分位处理
  return (value < 0 ? '-¥' : '¥') + result
}
```

board-finance.ts 使用示例：
```typescript
import { formatMoney } from '../../utils/money'
// ...
wine: formatMoney(row.liquor?.value),
table: formatMoney(row.tableFee?.value),
```

### 建议
无。格式化规范已完整覆盖：
- 设计文档（DISPLAY-STANDARDS.md）定义了规则
- TS 工具函数（money.ts）供 JS 层使用
- WXS 工具函数（format.wxs）供 WXML 模板使用
- 看板页面已实际调用格式化函数
