From 21f646aeee403b59e062cfef7556179f038888ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elena=20Torr=C3=B3?= Date: Tue, 30 Jun 2026 10:35:03 +0200 Subject: [PATCH] :bug: Fix decimal rounding and format in WebGL rulers (#10487) --- render-wasm/src/fonts/WorkSans-Numeric.ttf | Bin 9828 -> 4460 bytes render-wasm/src/render/rulers.rs | 16 +++++++--------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/render-wasm/src/fonts/WorkSans-Numeric.ttf b/render-wasm/src/fonts/WorkSans-Numeric.ttf index 9566da91bebf127c6b72280a4c210c60ee8c388e..eeb70b375f6e5bbef0dd606c3aae00d29e9e6f3b 100644 GIT binary patch delta 1355 zcmYjRU2GIp6h8ON>`Z6&hn1hwV!`QlyX`J4D_ge4Xd>t~EuodB8xq$7GO0@!!k}0wx<0lO`H5m=FFN9!742d-{L?x~-mGQf`8)R;J=YBuu z+%xx{?d{>;V>J>)6sEUGqtU_99fkCpy;Y(}FA>iS7Ir@U?}t`FHPPeUr#qSuVLRw*M0SlE^ND z>o1o}HP^f<&LF`sh|M&U0j_WKx1sC` zY{EPrn1w!o-Fu<0qZITxqgrEACcO8#@00B>(j{>ejMHQ~{6#S;PJrobGHrfC3@Iko zWGr~bR8&`!S>yjBwksyyWMYUas;KTJqai8_PtByn1ExLVI5z8ffEia|xPDb)Oc>%N zKFtP-zAQ@?A-cq;fE|T9L`aM(y;I>f_=gmZDQrO>Q~oZ6*X$Ce*sh4UBIE`|70|7) zhJdWn6ZiE!{0TPfxsS({zn3oKdShY`1>Pc4-Q34kT;7~5Mo{Gq*#zFNRx&K8LyVx# zTZBXOp0)SmesaO7DB>*$W3bw^0@Cf^Q;^(H5mzTO7ZLKXJRUC+ei=$VoWa~4d84V1 zLvJUXv9}PJsO9|zU7;#kjUH1i)}`8Qc5OVq7JpSWV}(|u=jo=Xiwu5sBvy6iME%|c zktr0Q5Ur;V@I5XC6avwFbm_*Epl9e6xUoaYhV z$-BA46@HbE@GKwak8qG*^G}+o4QTtcQ`)@to1W1p^&|Q*wH5RG@6F6#_gbRYG@J6? z^=OY+|KUTgCDGhukPZ{mMtU5LK$NCO<=ejo){teP#gpgvcK*mKHo{6GFJ^EQVX62R zy)E(9b^bXl7ZmZQ|CxUb2tVbe$6xS1by~ft_>lL7W9a@5{#g)h?Ekg&`rG?HzRgQ_ zFR!J@LK!x;mE~w^=-5%mfd!}q#Tamy7!pZrVc2Szl*Ev6Ar-G-#qh{1|K|w6E3*Vu a7DHt*RhE$aM`U9u(=fg`MZ&9hfA=3KfiVXF literal 9828 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 g4tnLdyEOVnjG2qK^>HVD~-=>Px# diff --git a/render-wasm/src/render/rulers.rs b/render-wasm/src/render/rulers.rs index 582469e8ee..0d4fbd2379 100644 --- a/render-wasm/src/render/rulers.rs +++ b/render-wasm/src/render/rulers.rs @@ -74,15 +74,13 @@ fn calculate_step_size(zoom: f32) -> f32 { } fn format_label(value: f32) -> String { - // Match `format-number` in app.main.ui.formats: round to integer if whole, - // else 2 decimals. Tick steps are integers in our table, so this is the - // common path. - let rounded = value.round(); - if (value - rounded).abs() < 1e-3 { - format!("{}", rounded as i64) - } else { - format!("{:.2}", value) - } + // Match `format-number` in app.main.ui.formats: round to at most 2 decimals. + // Display drops trailing zeros for free, so 123.00 -> "123", + // 123.50 -> "123.5", 123.456 -> "123.46". + let rounded = (value * 100.0).round() / 100.0; + // Normalize -0.0 so we don't render "-0". + let rounded = if rounded == 0.0 { 0.0 } else { rounded }; + format!("{rounded}") } fn with_alpha(color: Color, alpha_fraction: f32) -> Color {