diff --git a/frontend/src/components/backtest/MetricCards.vue b/frontend/src/components/backtest/MetricCards.vue index dd2fab8..b3af199 100644 --- a/frontend/src/components/backtest/MetricCards.vue +++ b/frontend/src/components/backtest/MetricCards.vue @@ -17,10 +17,13 @@ interface RelativeMetrics { const props = defineProps<{ metrics: RelativeMetrics }>() -// null/NaN 安全格式化(后端 NaN→None,退化指标如 sortino 可能为 null) +// null/NaN/字符串 安全格式化。后端 statistics 字段可能返字符串(如 sharpe_ratio="0", +// vnpy 原始统计),原 value.toFixed 在字符串上抛 TypeError 致整个结果页渲染崩溃 +// (指标卡 + 所有图表全空)。Number() 统一转换兜底。 function fmt(value: number | null | undefined, digits: number, percent = false): string { - if (value == null || isNaN(value as number)) return '—' - return percent ? `${(value * 100).toFixed(digits)}%` : value.toFixed(digits) + const n = Number(value) + if (value == null || Number.isNaN(n)) return '—' + return percent ? `${(n * 100).toFixed(digits)}%` : n.toFixed(digits) } // 格式化百分比(×100,保留2位小数)