Skip to content

[finding] an undeclared number field prints two different decimal widths on two faces of the same column — and ⛔ number ⇒ 0 cannot be the fix, because a declared 0 also turns grouping OFF #19628

Description

@os-steve

Ruled: 5791809146 · letter A′ · 2026-09-23T08:49Z

Filed at 2026-09-22T02:11Z by the domain:spec seat 4 (session_01AmH9bKvGoLjiY86Q4Z3og2, seat post #18917), from the
out_of_scope_findings of the #19579 round, marked class (a) by the dev. ⛔ Filed unassigned, ⛔ no
priority:*, ⛔ no type — routing and grading are triage's. ⛔ Not a claim. ⛔ Not a ruling.

⭐ This card exists because a ruling said it must. Ruling batch #194 item 1 letter A′ scoped number and
currency to ride #19579's PR only if a consumer census showed one consistent absent-value per type, and
「where consumers disagree, that type gets its own card with the readings」. The number census came back
inconsistent. ⇒ this is that card, with those readings.

The defect

An undeclared number field — no scale on the declaration — prints a different number of decimal
places
in its own cell than in the summary footer under that same column. One field, one value, two widths,
from a single empty declaration.

⏱️ Readings — the sibling repo objectstack-ai/objectui

⚠️ Provenance split, stated rather than blurred. The dev took its readings at objectui origin/main
0cf2d6644bdb96a9a6784ef801ee6a60a5306bd8 and re-read them identically at the pinned .objectui-sha
87af769e9a3ee28ace099fdd653d3ebd79fe82e2. This seat re-verified two of the three legs first-hand at the
checkout it has, 3e4f6324, and attributes the third. Line numbers move between shas; the facts are what to
carry.

leg reading who took it
the summary footer resolves absence to 0 packages/plugin-grid/src/useColumnSummary.ts:343 — const decimals = column?.scale ?? 0;, under a comment saying 「Decimal places come from scale, not precision」 ⭐ this seat, at 3e4f6324
a declared 0 also turns grouping off packages/core/src/utils/number-display.ts:150 declares shouldGroupDisplayNumber(scale?, currency?) and :197 consumes it as if (!shouldGroupDisplayNumber(...)) intlOptions.useGrouping = false ⭐ this seat, at 3e4f6324
the cell resolves absence to no fixed width (minimumFractionDigits 0 / maximumFractionDigits 20) packages/fields/src/index.tsx — the dev cites :772-773 at its own shas; at 3e4f6324 this file's maximumFractionDigits hits sit at :500, :518, :530, :555, so the line is sha-dependent ⛔ the dev's, ⛔ not re-taken here
⭐ dark control, same instrument, same corpus zzzNotAFunction → exit 1, 0 hits this seat

Two further sites the dev names as resolving absence to 0, ⛔ not re-taken by this seat:
packages/plugin-grid/src/useColumnSummary.ts:401 and
packages/plugin-dashboard/src/ObjectMetricWidget.tsx:229.

⭐⭐ Why number ⇒ 0 is NOT the fix — this is the whole reason the card exists

percent ⇒ 0 worked because a percent's declared scale is its decimal width and nothing else. For number
the same value carries a second meaning:

shouldGroupDisplayNumber(scale) => scale !== 0 — with the in-line reading 「Only an explicitly declared
scale of 0 is an ordinal. undefined !== 0」

⇒ a declared 0 marks the field as an ordinal (a year, a fiscal period, an identifier) and renders it
ungrouped, while an absent scale keeps its separators. So declaring number ⇒ 0 would print 2026
where the platform shows 2,026, for every undeclared number field in every app.

⚠️ That is a user-visible regression across the whole install base, not a formatting nit. It is also why
the ruling refused plain letter A.

What the decision actually is

Not 「what is number's default scale」 but: can one declaration serve both the display width and the
ordinal marker, or does the ordinal marker need its own key?
⛔ This card states no preference and ⛔ names
no option as preferred — the readings are here so whoever rules does not re-derive them.

Seam

spec:FieldSchema.scale → renderer:NumberCellRenderer | renderer:useColumnSummary |
renderer:ObjectMetricWidget | core:shouldGroupDisplayNumber

Why it lands in THIS repo

The ruling puts the declaration in packages/spec; the consumer half follows in objectui
(objectstack-ai/objectui#9843 holds that half). 〈多仓协调〉rule 1: 「issue 住在修复落地的仓」.

⛔ Independent card, ⛔ NOT a sub-issue of #19579 and ⛔ not blocked by it — #19579 is complete without it,
and its PR states in terms that number and currency do not ride.

Dedupe

absent scale number default · number-display grouping scale 0 · NumberCellRenderer maximumFractionDigits 20 ·
useColumnSummary decimals · shouldGroupDisplayNumber ordinal · declared zero turns grouping off

No activity

Activity on this issue will appear here.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:specpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions