[F8-08] Формат чисел: моноширинный, фикс. точность, выравнивание #51

Closed
opened 2026-05-25 21:40:19 +00:00 by owner · 3 comments
Collaborator

Подзадача полировки UI (этап F8), родительский #43.

Цель: Единый формат чисел: моноширинно, фиксированная точность, выравнивание по правому краю, без разделителей разрядов.

Пункты из #43:

17. inspector. Выбрана планета или любой другой объект. Цифры из отчёта - coordinates, size, resources. и т.п. написать fixed-шрифтом, в одну строчку. Координаты - без круглых скобок по бокам. Убрать слово "stockpile" из ind/mat заголовков, столбец распирают.
25. Меню turn report. player status. значения drive/weapons/shields/cargo - это не проценты, это уровни технологий. Отображать as-is из отчёта.
26. Меню turn report. Давай все цифры в отчёте сделаем фиксированым шрифтом, чтобы не прыгали перед глазами. При этом, если получится так сделать, табличные значения в одной колонке выровнять по десятичной запятой по вертикали, не знаю, как это сефас делается, с помощью стилей или "добиванием" пробелами фиксированных шрифтов.
27. Вдогонку к 26. обрати внимание на tools/local-dev/reports/dg/KNNTS041.REP - в Status of Players все цифры имеют точность 2 знака после запятой, никаких разделителей разрядов. В таблицах turn report надо отображать точно так же, тогда проблема с выравниванием уйдет - просто по правому краю и будет красиво. Единственный нюанс, в legacy-отчетах точность 2 знака, в нашем случае game engine будет присылать 3 знака после десятичной запятой.

Заметка. Общий util формата; точность: legacy 2 знака / game engine 3 знака после запятой (эталон — tools/local-dev/reports/dg/KNNTS041.REP, секция Status of Players); п.25 — drive/weapons/shields/cargo это уровни технологий, не проценты, отображать as-is. Затрагивает inspector (п.17) и turn report (п.26/27) — один util на оба.


Порядок обработки: F8-08 из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач.

Подзадача полировки UI (этап **F8**), родительский #43. **Цель:** Единый формат чисел: моноширинно, фиксированная точность, выравнивание по правому краю, без разделителей разрядов. **Пункты из #43:** > **17.** inspector. Выбрана планета или любой другой объект. Цифры из отчёта - coordinates, size, resources. и т.п. написать fixed-шрифтом, в одну строчку. Координаты - без круглых скобок по бокам. Убрать слово "stockpile" из ind/mat заголовков, столбец распирают. > **25.** Меню turn report. player status. значения drive/weapons/shields/cargo - это не проценты, это уровни технологий. Отображать as-is из отчёта. > **26.** Меню turn report. Давай все цифры в отчёте сделаем фиксированым шрифтом, чтобы не прыгали перед глазами. При этом, если получится так сделать, табличные значения в одной колонке выровнять по десятичной запятой по вертикали, не знаю, как это сефас делается, с помощью стилей или "добиванием" пробелами фиксированных шрифтов. > **27.** Вдогонку к 26. обрати внимание на tools/local-dev/reports/dg/KNNTS041.REP - в Status of Players все цифры имеют точность 2 знака после запятой, никаких разделителей разрядов. В таблицах turn report надо отображать точно так же, тогда проблема с выравниванием уйдет - просто по правому краю и будет красиво. Единственный нюанс, в legacy-отчетах точность 2 знака, в нашем случае game engine будет присылать 3 знака после десятичной запятой. _Заметка._ Общий util формата; точность: legacy 2 знака / game engine 3 знака после запятой (эталон — `tools/local-dev/reports/dg/KNNTS041.REP`, секция Status of Players); п.25 — drive/weapons/shields/cargo это **уровни технологий**, не проценты, отображать as-is. Затрагивает inspector (п.17) и turn report (п.26/27) — один util на оба. --- _Порядок обработки: **F8-08** из 12. Создано в рамках #43; зонтичный issue остаётся открытым до закрытия всех подзадач._
owner added the Kind/EnhancementKind/Bug
Priority
Medium
3
ready
labels 2026-05-25 21:40:19 +00:00
developer was assigned by owner 2026-05-25 21:40:19 +00:00
developer added
claude
working
and removed ready labels 2026-05-26 07:01:41 +00:00
developer added ready and removed
claude
working
labels 2026-05-26 07:09:00 +00:00
developer added
claude
working
and removed ready labels 2026-05-26 10:25:54 +00:00
developer added ready and removed
claude
working
labels 2026-05-26 10:27:10 +00:00
developer added
claude
working
and removed ready labels 2026-05-26 11:49:51 +00:00
Owner
Working log (issue-agent) — click to expand

State: blocked
Updated: 2026-05-26 (UTC)
Branch / PR:
Confirmed:

  • Data: Player.{drive,weapons,shields,cargo} come from r.TechLevel(...) (game/internal/controller/report.go:67-70) — they are tech LEVELS (e.g., 4.51), not fractions. Same fields render in lib/active-view/report/section-player-status.svelte:76-79 AND lib/active-view/table-races.svelte:270-277 through formatPercent → multiplied by 100. Sciences (Science/OtherScience) ARE fractions in [0,1] summing to 1 — formatPercent is correct there.
  • Inspector formatNumber (planet lib/inspectors/planet.svelte:106, ship-group lib/inspectors/ship-group.svelte:85, ship-groups lib/inspectors/planet/ship-groups.svelte:93, ship-group/actions lib/inspectors/ship-group/actions.svelte:678) all use toLocaleString({maximumFractionDigits:2}) — locale separators + varying width.
  • Report section formatters in lib/active-view/report/format.ts (formatFloat = 0–2 dec w/ separators; formatCount = 0 dec w/ separators; formatVotes = 0–2 dec; formatPercent = ×100 + 1 dec).
  • Engine wire = Float with Fixed3 quantisation (pkg/model/report/report.go:11-15); legacy text reports under tools/local-dev/reports/dg/*.REP have 2 decimals (e.g., KNNTS041.REP Status of Players).
  • Reference design: monospace + right-aligned + 3 decimals fixed + no thousands separators for Floats; integer counts (planets:uint16, ship count:uint64) — 0 decimals.
  • p.17 specifics: planet inspector coordinates currently (${x}, ${y}) — drop parens; field labels industry stockpile ($) / materials stockpile (M) (en.ts:252-253, ru.ts:253-254) — drop the word "stockpile".
  • Mono token exists: --font-mono in lib/theme/tokens.css:39.
  • Affected tests (mostly substring-safe, but coords test breaks): tests/inspector-planet.test.ts:88-90 asserts "(100.25, 200)" literally — needs update to the unparenthesized 3-decimal form; other toHaveTextContent("500") style assertions stay valid because they're substrings of "500.000".

Open question: Posted to the owner (RU): (1) scope — fix table-races.svelte in the same diff or treat as a follow-up? (2) sciences — keep at 1-dec percent (recommendation), or push them through the new 3-decimal level format too?

Decisions: (pending owner reply) Util to live at ui/frontend/src/lib/util/number-format.ts; the existing report/format.ts will become a thin re-export to keep the report imports compact. CSS: switch inspector dd and report .grid td to font-family: var(--font-mono) plus text-align: right for numeric cells.

Next: Wait for owner answers to the scope/sciences fork, then branch feature/issue-51-number-format, implement, update i18n + tests, open PR to development requesting owner as reviewer.

<!-- issue-agent:worklog --> <details> <summary>Working log (issue-agent) — click to expand</summary> **State:** blocked **Updated:** 2026-05-26 (UTC) **Branch / PR:** — **Confirmed:** - Data: `Player.{drive,weapons,shields,cargo}` come from `r.TechLevel(...)` (`game/internal/controller/report.go:67-70`) — they are tech LEVELS (e.g., 4.51), not fractions. Same fields render in `lib/active-view/report/section-player-status.svelte:76-79` AND `lib/active-view/table-races.svelte:270-277` through `formatPercent` → multiplied by 100. Sciences (`Science`/`OtherScience`) ARE fractions in `[0,1]` summing to 1 — `formatPercent` is correct there. - Inspector `formatNumber` (planet `lib/inspectors/planet.svelte:106`, ship-group `lib/inspectors/ship-group.svelte:85`, ship-groups `lib/inspectors/planet/ship-groups.svelte:93`, ship-group/actions `lib/inspectors/ship-group/actions.svelte:678`) all use `toLocaleString({maximumFractionDigits:2})` — locale separators + varying width. - Report section formatters in `lib/active-view/report/format.ts` (`formatFloat` = 0–2 dec w/ separators; `formatCount` = 0 dec w/ separators; `formatVotes` = 0–2 dec; `formatPercent` = ×100 + 1 dec). - Engine wire = `Float` with `Fixed3` quantisation (`pkg/model/report/report.go:11-15`); legacy text reports under `tools/local-dev/reports/dg/*.REP` have 2 decimals (e.g., `KNNTS041.REP` Status of Players). - Reference design: monospace + right-aligned + 3 decimals fixed + no thousands separators for Floats; integer counts (`planets:uint16`, ship `count:uint64`) — 0 decimals. - p.17 specifics: planet inspector coordinates currently `(${x}, ${y})` — drop parens; field labels `industry stockpile ($)` / `materials stockpile (M)` (en.ts:252-253, ru.ts:253-254) — drop the word "stockpile". - Mono token exists: `--font-mono` in `lib/theme/tokens.css:39`. - Affected tests (mostly substring-safe, but coords test breaks): `tests/inspector-planet.test.ts:88-90` asserts `"(100.25, 200)"` literally — needs update to the unparenthesized 3-decimal form; other `toHaveTextContent("500")` style assertions stay valid because they're substrings of `"500.000"`. **Open question:** Posted to the owner (RU): (1) scope — fix `table-races.svelte` in the same diff or treat as a follow-up? (2) sciences — keep at 1-dec percent (recommendation), or push them through the new 3-decimal level format too? **Decisions:** (pending owner reply) Util to live at `ui/frontend/src/lib/util/number-format.ts`; the existing `report/format.ts` will become a thin re-export to keep the report imports compact. CSS: switch inspector `dd` and report `.grid td` to `font-family: var(--font-mono)` plus `text-align: right` for numeric cells. **Next:** Wait for owner answers to the scope/sciences fork, then branch `feature/issue-51-number-format`, implement, update i18n + tests, open PR to `development` requesting `owner` as reviewer. </details>
Owner

@owner — пара вопросов перед тем, как браться за код. ✦

Закопалась в данные: Player.{drive,weapons,shields,cargo} идут из движка как уровни технологий (r.TechLevel(...) в game/internal/controller/report.go:67-70), а в UI везде, где они показываются, прогоняются через formatPercent (× 100). Это и есть баг п.25 в секции turn report → player status. Точно тот же баг есть в активной view «расы» (ui/frontend/src/lib/active-view/table-races.svelte:270-277): там тоже formatPercent(r.drive) + заголовок «drive %». После фикса player status покажет «drive: 4.510», а Races продолжит показывать «drive %: 451.0».

1. Чинить ли заодно table-races.svelte в этом же PR? Объём — те же 4 поля + правка i18n-заголовков (убрать «%»). Pro: данные не разойдутся между экранами; общий util ровно для этого и заводим. Con: формально вне scope F8-08 (issue прямо называет inspector + turn report). Я бы починила здесь — но за тобой решение.

2. Точность для наук. Формулы наук (Science/OtherScience) — это пропорции в [0,1], сумма = 1.0. Сейчас formatPercent → «15.0» при 0.15, заголовок «drive %». Это семантически процент формулы, не уровень технологии. Моё предложение — оставить науки как 1-знаковый процент, чинить только уровни. Ок?

Чтобы не ждать ответа по мелочам, остальное сделаю по своему чтению:

  • Заголовки инспектора планеты: «industry stockpile ()» → «industry ()», «materials stockpile (M)» → «materials (M)».
  • Координаты в инспекторе планеты И в ship-group (unidentified): «x, y» без скобок.
  • Числа из движка (Float через Fixed3): 3 знака после точки, без разделителей разрядов, моноширинно (--font-mono). Целочисленные счётчики (planet count, ship count) — как есть, без дробной части.
  • Общий util — ui/frontend/src/lib/util/number-format.ts, lib/active-view/report/format.ts оставлю тонким re-export, чтобы сохранить минимальный diff в секциях.
  • В табличных td (turn report) добавлю text-align: right для числовых колонок и font-family: var(--font-mono).

По ответам — пойду открывать PR.

@owner — пара вопросов перед тем, как браться за код. ✦ Закопалась в данные: `Player.{drive,weapons,shields,cargo}` идут из движка как **уровни** технологий (`r.TechLevel(...)` в `game/internal/controller/report.go:67-70`), а в UI везде, где они показываются, прогоняются через `formatPercent` (`× 100`). Это и есть баг п.25 в секции turn report → player status. **Точно тот же баг** есть в активной view «расы» (`ui/frontend/src/lib/active-view/table-races.svelte:270-277`): там тоже `formatPercent(r.drive)` + заголовок «drive %». После фикса player status покажет «drive: 4.510», а Races продолжит показывать «drive %: 451.0». **1. Чинить ли заодно `table-races.svelte` в этом же PR?** Объём — те же 4 поля + правка i18n-заголовков (убрать «%»). Pro: данные не разойдутся между экранами; общий util ровно для этого и заводим. Con: формально вне scope F8-08 (issue прямо называет inspector + turn report). Я бы починила здесь — но за тобой решение. **2. Точность для наук.** Формулы наук (`Science`/`OtherScience`) — это пропорции в `[0,1]`, сумма = 1.0. Сейчас `formatPercent` → «15.0» при 0.15, заголовок «drive %». Это семантически процент формулы, не уровень технологии. Моё предложение — **оставить науки как 1-знаковый процент**, чинить только уровни. Ок? Чтобы не ждать ответа по мелочам, остальное сделаю по своему чтению: - Заголовки инспектора планеты: «industry stockpile ($)» → «industry ($)», «materials stockpile (M)» → «materials (M)». - Координаты в инспекторе планеты И в ship-group (unidentified): `«x, y»` без скобок. - Числа из движка (`Float` через `Fixed3`): 3 знака после точки, без разделителей разрядов, моноширинно (`--font-mono`). Целочисленные счётчики (planet count, ship `count`) — как есть, без дробной части. - Общий util — `ui/frontend/src/lib/util/number-format.ts`, `lib/active-view/report/format.ts` оставлю тонким re-export, чтобы сохранить минимальный diff в секциях. - В табличных td (turn report) добавлю `text-align: right` для числовых колонок и `font-family: var(--font-mono)`. По ответам — пойду открывать PR.
developer added
claude
blocked
and removed
claude
working
labels 2026-05-26 11:59:19 +00:00
Author
Collaborator
  1. Да, чинить везде. Спасибо!
  2. Науки с точностью до 0.1%, это будет соответствовать общей семантике "3 знака после запятой".
1. Да, чинить везде. Спасибо! 2. Науки с точностью до 0.1%, это будет соответствовать общей семантике "3 знака после запятой".
owner added
claude
working
and removed
claude
blocked
labels 2026-05-27 08:38:27 +00:00
owner added
claude
done
and removed
claude
working
labels 2026-05-27 09:42:20 +00:00
owner closed this issue 2026-05-27 09:42:40 +00:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: developer/galaxy-game#51