diff --git a/index.html b/index.html index 0875a82..8839d50 100644 --- a/index.html +++ b/index.html @@ -222,6 +222,7 @@

Unlock pad

function fmtUsd(n){ if(n==null||isNaN(n))return "-"; var a=Math.abs(n),dp=a>=1000?0:a>=1?2:a>=0.01?4:6; return "$"+Number(n).toLocaleString("en-US",{minimumFractionDigits:dp,maximumFractionDigits:dp}); } function fmtSignedUsd(n){ if(n==null||isNaN(n))return "-"; return (n>=0?"+":"-")+fmtUsd(Math.abs(n)); } +function fmtSignedUsd2(n){ if(n==null||isNaN(n))return "-"; return (n>=0?"+":"-")+"$"+Math.abs(n).toLocaleString("en-US",{minimumFractionDigits:2,maximumFractionDigits:2}); } function fmtPct(n){ if(n==null||isNaN(n))return ""; return (n>=0?"+":"")+Number(n).toFixed(2)+"%"; } function cls(n){ return n>0?"up":n<0?"down":"flat"; } function esc(s){ return String(s==null?"":s).replace(/&/g,"&").replace(//g,">").replace(/"/g,"""); } @@ -521,7 +522,7 @@

Unlock pad

} function pnlHtml(p){ if(!p) return ""; - var day=(p.d1==null)?"—":fmtSignedUsd(p.d1); + var day=(p.d1==null)?"—":fmtSignedUsd2(p.d1); return '
'+ '
P/L today
'+ '
'+day+"
"+ diff --git a/server_test.go b/server_test.go index 4911dd8..eca3b3e 100644 --- a/server_test.go +++ b/server_test.go @@ -587,6 +587,20 @@ func TestIndexExplainsMissingWallet(t *testing.T) { } } +func TestPnlTodayUsesTwoDecimals(t *testing.T) { + b, err := os.ReadFile("index.html") + if err != nil { + t.Fatal(err) + } + s := string(b) + if !strings.Contains(s, `minimumFractionDigits:2,maximumFractionDigits:2`) { + t.Error("index.html missing fixed two-decimal currency formatter") + } + if !strings.Contains(s, `var day=(p.d1==null)?"—":fmtSignedUsd2(p.d1)`) { + t.Error("P/L today must use the fixed two-decimal formatter") + } +} + func hourly(vals ...float64) [][2]float64 { now := float64(time.Now().Unix()) out := make([][2]float64, len(vals))