diff --git a/frontend/src/format.ts b/frontend/src/format.ts new file mode 100644 index 0000000..1561793 --- /dev/null +++ b/frontend/src/format.ts @@ -0,0 +1,43 @@ +/** 价格按交易所常见精度:永续/指数 0.01;期权权利金 0.1 */ + +export type PxKind = "perp" | "option" | "index"; + +export function fmtExPx( + kind: PxKind, + px: number | null | undefined, +): string { + if (px == null || Number.isNaN(Number(px))) return "—"; + const n = Number(px); + if (kind === "option") { + return (Math.round(n * 10) / 10).toFixed(1); + } + return (Math.round(n * 100) / 100).toFixed(2); +} + +export function fmtTopEx( + kind: PxKind, + px: number | null | undefined, + sz: number | null | undefined, +): string { + if (px == null || Number.isNaN(Number(px))) return "—"; + const p = fmtExPx(kind, px); + if (sz == null || Number.isNaN(Number(sz))) return p; + const n = Number(sz); + const s = + n >= 100 ? n.toFixed(0) : n >= 10 ? n.toFixed(1) : n.toFixed(2); + return `${p}(${s})`; +} + +export function fmtBidLiqEx( + kind: PxKind, + px: number | null | undefined, + sz: number | null | undefined, +): string { + if (px == null || Number.isNaN(Number(px))) return "—"; + const p = fmtExPx(kind, px); + if (sz == null || Number.isNaN(Number(sz))) return p; + const n = Number(sz); + const s = + n >= 100 ? n.toFixed(0) : n >= 10 ? n.toFixed(1) : n.toFixed(2); + return `${p}/${s}`; +} diff --git a/frontend/src/pages/Plan.tsx b/frontend/src/pages/Plan.tsx index d03720b..1a097f5 100644 --- a/frontend/src/pages/Plan.tsx +++ b/frontend/src/pages/Plan.tsx @@ -1,27 +1,12 @@ import { useEffect, useState } from "react"; import { apiFetch, MarketSnapshot, PlanState } from "../api/client"; +import { fmtBidLiqEx, fmtExPx, fmtTopEx } from "../format"; function fmt(n: number | null | undefined, d = 2) { if (n == null || Number.isNaN(n)) return "—"; return n.toFixed(d); } -/** 卖一/买一 + 对应档量:8.80(12.5) / 7.20(8.0) */ -function fmtTop(px: number | null | undefined, sz: number | null | undefined) { - if (px == null || Number.isNaN(px)) return "—"; - if (sz == null || Number.isNaN(sz)) return fmt(px); - const s = sz >= 100 ? sz.toFixed(0) : sz >= 10 ? sz.toFixed(1) : sz.toFixed(2); - return `${fmt(px)}(${s})`; -} - -/** 持仓买一:价格/流动性张数,如 17.00/4000 */ -function fmtBidLiq(px: number | null | undefined, sz: number | null | undefined) { - if (px == null || Number.isNaN(px)) return "—"; - if (sz == null || Number.isNaN(sz)) return fmt(px); - const s = sz >= 100 ? sz.toFixed(0) : sz >= 10 ? sz.toFixed(1) : sz.toFixed(2); - return `${fmt(px)}/${s}`; -} - /** 期权杠杆 = 标的 ÷ 权利金 */ function optionLevLabel( underlying: number | null | undefined, @@ -607,11 +592,15 @@ export default function PlanPage() {