Skip to content

Numbers

Each kind of value, from a count of work permits to the date of an interview, is written one way: in the reader's language, with digits that line up.

The reader's language

Numbers follow the language the person chose in WerkOS, on boards, charts and reports alike. English groups thousands with a comma, Croatian and Serbian with a full stop, and the decimal mark changes with them.

Digits stay Latin in each language, and a negative value takes the true minus sign, which is as wide as a digit and keeps a column straight.

The same three values in English, Croatian and Serbian
LanguageCountPercentChange
English1,247,0008.4%−3.2%
Croatian1.247.0008,4 %−3,2 %
Serbian1.247.0008,4%−3,2%

Each kind of value

Choose the kind first and the format follows.

Count
A whole number, grouped by the language. Negative only in a column that allows a sign.
1,247,000
Money
Digits, then the currency code after a space. Whole units outside the board grid. In a table the code moves to the header.
3,450 EUR
Percent
One decimal under 10, whole numbers from 10. A tiny value above zero reads under 0.1%. In a table column, each figure takes the decimals the column needs.
8.4%, 100%, under 0.1%
Change in a percentage
In points, one decimal, signed unless zero. The header says points.
+2.4 and −1.3 points
Change
A plus or a minus sign, in the unit of the value.
+12 and −3
Large values
From 10,000, shortened with k, m and bn on chart axes only. Labels, tiles and tables print the full figure.
149k, 1.25m
Year
Not grouped.
2025
Range
The low and the high joined by to, with the unit once at the end.
120,000 to 150,000
Rank
The position and the total joined by of, with its interval in reports. No ordinals.
3 of 53, interval 2 to 6
Duration
Hours and minutes, as in 2h 30m. A running timer shows 02:30:09.
2h 30m, 02:30:09
Date
Day, short month and year, as in 28 Jun 2026. Dense cells drop the current year.
28 Jun 2026, 28 Jun
Missing
n/a and its reason in reports and charts. A blank cell on a board.
n/a, closed

Signs and changes

A change shows its sign: a plus for a rise, a true minus for a fall, nothing for zero. Negative numbers keep the normal ink. Color may add a judgment, such as a fall that is good news, but the sign alone tells the direction.

  • Offers accepted48+12% on last month
  • No show rate14%+3.0 points on last month
  • Interviews held38+6 on last week
Table 1. Work permits issued and their change
MarketWork permits issued, 2026Change on 2025
Serbia9,400+1,200
Bosnia and Herzegovina7,100−340
North Macedonia4,6000

Table 1. Work permits issued and their change

Serbia

Work permits issued, 2026
9,400
Change on 2025
+1,200

Bosnia and Herzegovina

Work permits issued, 2026
7,100
Change on 2025
−340

North Macedonia

Work permits issued, 2026
4,600
Change on 2025
0

Source: Werklist, example figures.

Minus
U+2212
Plus
U+002B, on changes only
Good change
success ink
--success-ink
Bad change
error ink
--error-ink

Digits that line up

Wherever numbers stand above each other, use tabular digits so each digit takes the same width. In running text the normal digits read better.

  1. 111,111
  2. 9,480
  3. 71,017
  4. 1,203
  5. 48,888
  6. 11
Proportional
  1. 111,111
  2. 9,480
  3. 71,017
  4. 1,203
  5. 48,888
  6. 11
Tabular
Tabular digits
font-variant-numeric: tabular-nums
In a board cell
14 px, weight 400
--text
In a report table
8.5 pt on paper, 13 px on screen
--text

Missing, zero and too few

Zero is a value and prints as 0. A figure that does not exist prints n/a, and a report adds the reason when the column has room: closed, unpublished, out of scope, not collected or pending.

On a board, a blank cell means nobody has filled it in yet. A rate built on fewer than 5 observations is not printed as a number. Its reason takes the place of the figure.

Permitted and not permitted

Permitted

  • Write the currency as its code after the figure

    EUR, not the euro sign.

  • Shorten large numbers on chart axes

    Label the marks themselves in full.

Not permitted

  • Wrap a negative number in parentheses

    Use the minus sign.

  • Type a figure into copy that the data can change

    It goes stale with the next update. Compute it.

  • Write a date in figures only

    A date like 6/7 means June to some readers and July to others.

NextCharts

Numbers

How WerkOS writes counts, money, percentages, changes, durations and dates: one format per kind of value, in the reader's language.

  • Kind: data
  • Page: https://design.werklist.com/data/numbers
  • Version: 2.1.2

Rules

  • Language: numbers follow the language the person chose in WerkOS (English, Croatian or Serbian), never the browser's. Serbian is written in Latin script and digits are always Latin
  • Grouping: English groups thousands with a comma, Croatian and Serbian with a full stop, and the decimal mark changes with them
  • Count: a whole number, grouped. Negative only in a column that allows a sign
  • Money: the digits, a no break space, then the currency code, as in 3,450 EUR. Whole units in tiles, charts and reports, the column's own decimals on a board. In a table the code goes in the header
  • Percent: one decimal under 10, whole numbers from 10. A value above zero but under 0.1 prints as under 0.1%. In a table column every figure shares the column's decimals
  • Change in a percentage: in points, one decimal, signed unless zero. The header says points
  • Change: a plus or a true minus sign, in the unit of the value
  • Large values: from 10,000, shortened with k, m or bn on chart axes only, with two decimals under 10, one under 100 and none above (1.25m, 149k). Labels, tiles and tables print the full figure
  • Year: never grouped
  • Range: the low and the high joined by to, the unit once at the end. A range across zero shows both signs
  • Rank: the position and the total joined by of, as in 3 of 53, with its interval in reports. Never an ordinal
  • Duration: hours and minutes, as in 2h 30m. A running timer shows 02:30:09
  • Date: day, short month and year, as in 28 Jun 2026, with month names in the reader's language. Dense cells drop the current year. Never a date in figures only
  • Missing: n/a with its reason (closed, unpublished, out of scope, not collected, pending) in reports and charts. On a board a blank cell means nobody has filled it. Zero prints 0
  • Minus: U+2212 in every language, never parentheses, never red
  • Tabular digits (font-variant-numeric: tabular-nums) wherever numbers stand above each other. Normal digits in running text
  • A rate built on fewer than 5 observations prints its reason, not a number
  • A figure the data can change is computed, never typed into copy
  • In an accessible name a duration spells its units (2 hours 30 minutes) and a date its full month

Tokens

  • --text
  • --text-muted
  • --success-ink
  • --error-ink

JSON

{
  "title": "Numbers",
  "path": "/data/numbers",
  "url": "https://design.werklist.com/data/numbers",
  "text": "https://design.werklist.com/agent/data/numbers",
  "summary": "How WerkOS writes counts, money, percentages, changes, durations and dates in the reader's language.",
  "version": "2.1.2",
  "kind": "data",
  "name": "Numbers",
  "purpose": "How WerkOS writes counts, money, percentages, changes, durations and dates: one format per kind of value, in the reader's language.",
  "rules": [
    "Language: numbers follow the language the person chose in WerkOS (English, Croatian or Serbian), never the browser's. Serbian is written in Latin script and digits are always Latin",
    "Grouping: English groups thousands with a comma, Croatian and Serbian with a full stop, and the decimal mark changes with them",
    "Count: a whole number, grouped. Negative only in a column that allows a sign",
    "Money: the digits, a no break space, then the currency code, as in 3,450 EUR. Whole units in tiles, charts and reports, the column's own decimals on a board. In a table the code goes in the header",
    "Percent: one decimal under 10, whole numbers from 10. A value above zero but under 0.1 prints as under 0.1%. In a table column every figure shares the column's decimals",
    "Change in a percentage: in points, one decimal, signed unless zero. The header says points",
    "Change: a plus or a true minus sign, in the unit of the value",
    "Large values: from 10,000, shortened with k, m or bn on chart axes only, with two decimals under 10, one under 100 and none above (1.25m, 149k). Labels, tiles and tables print the full figure",
    "Year: never grouped",
    "Range: the low and the high joined by to, the unit once at the end. A range across zero shows both signs",
    "Rank: the position and the total joined by of, as in 3 of 53, with its interval in reports. Never an ordinal",
    "Duration: hours and minutes, as in 2h 30m. A running timer shows 02:30:09",
    "Date: day, short month and year, as in 28 Jun 2026, with month names in the reader's language. Dense cells drop the current year. Never a date in figures only",
    "Missing: n/a with its reason (closed, unpublished, out of scope, not collected, pending) in reports and charts. On a board a blank cell means nobody has filled it. Zero prints 0",
    "Minus: U+2212 in every language, never parentheses, never red",
    "Tabular digits (font-variant-numeric: tabular-nums) wherever numbers stand above each other. Normal digits in running text",
    "A rate built on fewer than 5 observations prints its reason, not a number",
    "A figure the data can change is computed, never typed into copy",
    "In an accessible name a duration spells its units (2 hours 30 minutes) and a date its full month"
  ],
  "tokens": [
    "--text",
    "--text-muted",
    "--success-ink",
    "--error-ink"
  ]
}

Raw file: https://design.werklist.com/agent/data/numbers