> ## Content Index
> Fetch the complete content index at: https://notionsolutions.net/llms.txt
> Use this file to discover other available public pages before exploring further.

# Notion Formula Format: formatNumber(), formatDate() and style()
- URL: https://notionsolutions.net/notion-formula-format-style/
- Published: 2026-10-30T10:17:36.000Z
- Updated: 2026-10-30T10:17:39.000Z
- Description: format(), formatNumber(), formatDate() and style() turn a Notion formula's result into readable text: commas, currency, percent, date patterns, bold and color. All four return text, so here's when to keep a number with its Number format instead, plus fixes for the usual problems and four recipes.
- Author: Kevin Turner
- Tags: guide, databases

**To format a Notion formula's result, wrap the value in the function that fits it: format() for plain text, formatNumber() for commas, a currency or a percent, formatDate() for a date pattern such as "ddd, MMM D", and style() for bold, color or a highlight.** All four return text, so the result can't be calculated again. I'd keep the math in a formula that returns a number and format only the label people read, ideally in a second formula.

For a number that stands alone in a column, keep it a number and set its look in the property's Number format. For a number inside words, such as "Budget: $12,500", use formatNumber(). Thomas Frank's [formatNumber() reference](https://thomasjfrank.com/formulas/functions/formatnumber/?ref=notionsolutions.net) gives the reason in one line: the function "returns a string, meaning you can't do math on its output", and in Table views the Calculate menu "won't offer arithmetic options." Every formula below uses current syntax; [the Formulas 2.0 overview](https://notionsolutions.net/notion-formulas-2-0/) covers the rest of the language.

## Which formatting function does which job

Five functions change how a result looks, and two turn text back into a value you can calculate with. Read the Returns column first, because it decides what the result can still do. The rows come from Notion's [formula syntax reference](https://www.notion.com/help/formula-syntax?ref=notionsolutions.net), except the input types for format(), which Frank lists.

__Formatting and conversion functions in Notion formulas__
| Function       | Takes                                          | Returns     | Use it for                                                                  |
| -------------- | ---------------------------------------------- | ----------- | --------------------------------------------------------------------------- |
| format()       | Any value: number, date, Boolean, text or list | Text        | Plain conversion, such as putting a date or a yes/no value into a sentence  |
| formatNumber() | A number                                       | Text        | Commas, a currency, a percent or a compact 1.2M                             |
| formatDate()   | A date and a pattern                           | Text        | A date written your way, such as "Sat, Nov 14"                              |
| style()        | Text and one or more styles                    | Styled text | Bold, underline, italics, code, strikethrough, a text color or a background |
| unstyle()      | Styled text                                    | Text        | Removing every style, or one named style                                    |
| toNumber()     | Text such as "2"                               | Number      | Turning plain digits back into a number: toNumber("2") = 2                  |
| parseDate()    | Text in ISO 8601 form                          | Date        | Turning "2022-01-01" back into the date January 1, 2022                     |

[![Flow diagram: a number, a date and a true value pass through formatNumber(), formatDate() and format() into one Text box, then style() turns the text into a bold red label](https://storage.ghost.io/c/5c/30/5c30c46b-86a3-4d20-984f-4f6ae8ad1ed2/content/images/2026/10/notion-formula-format-style-formatters-return-text.webp)](https://storage.ghost.io/c/5c/30/5c30c46b-86a3-4d20-984f-4f6ae8ad1ed2/content/images/2026/10/notion-formula-format-style-formatters-return-text.webp?ref=notionsolutions.net)

formatNumber(), formatDate() and format() all hand back text; style() can dress that text, but it can't be summed or date-filtered.

## format(): any value to plain text

format() takes one value and returns it as text. Notion's reference describes it as "Returns the value formatted as text", and its first example shows the catch: `format(1234)` returns "1234", with no thousands separator. Frank's [format() reference](https://thomasjfrank.com/formulas/functions/format/?ref=notionsolutions.net) lists both call styles:

```
format(value)
value.format()
```

It accepts numbers, dates, Booleans, text and lists. In Frank's examples, `format(true)` gives "true" and `format(5 + 5)` gives "10", both as text. On `now()` it returns the date and time as a string.

You often don't need to call it. Joining a number to text with `+` converts the number for you, and Frank shows it with a Number property set to 10:

```
"There are " + prop("Number") + " Straw Hat members."
```

That returns "There are 10 Straw Hat members." The digits come through as stored, which is why `"Total: " + prop("Budget")` shows 12500 even when the Budget property displays $12,500\. The currency look is a display setting on the Number property; the formula reads the value, and turning that value into text gives plain digits, exactly as `format(1234)` does. The [guide to prop() in Formulas 2.0](https://notionsolutions.net/notion-formula-prop/) lists what each property type hands a formula.

I'd still write format() in three places:

- Inside an if() or ifs() whose branches must all return text, so a number in one branch doesn't mix types with words in another.
- Around a date, a Boolean or a list that goes into a sentence. Frank warns that the formula editor "will almost never do automatic type conversion", so I wouldn't count on `+` for anything but numbers. For a list you want joined your own way, the [map() and filter() guide](https://notionsolutions.net/notion-formula-map-filter/) turns each item into text first.
- Wherever the next person editing the formula should see the conversion happen. The [time tracking guide](https://notionsolutions.net/notion-time-tracking/) builds its hours-and-minutes clock this way, with format() around each part.

What format() never adds is a comma, a currency sign or a fixed number of decimals. That's formatNumber()'s job.

## formatNumber(): commas, currency and percent

Notion's reference gives formatNumber() no description, only one example, and the example sums up the function well:

```
"Revenue: " + formatNumber(prop("Number"), "usd", 0).style("green")
```

That line writes a number as US dollars with no decimals, puts a word in front and colors the result green. The arguments themselves are documented on Frank's formatNumber() page:

```
formatNumber(number, format?, precision?)
number.formatNumber(format?, precision?)
```

Both extra arguments are optional. Called with no format, it uses commas, so `1234.formatNumber()` returns "1,234" in Frank's examples. Precision is "the number of decimal places (0-12)" and pads whole numbers with zeros: `12345.formatNumber("commas", 2)` returns "12,345.00". The table is a selection from Frank's option list; his currency rows share the usd input, and his page covers many more codes, from aud and cad to brl and zar.

__formatNumber() options with Thomas Frank's example inputs and outputs__
| Format option           | Example input | Output    |
| ----------------------- | ------------- | --------- |
| "commas" (the default)  | 12345         | 12,345    |
| "percent"               | 0.856         | 85.6%     |
| "humanize" or "compact" | 1234567       | 1.2M      |
| "bytes\_decimal"        | 12345678      | 12.35 MB  |
| "usd" or "dollar"       | 1234.56       | $1,234.56 |
| "eur" or "euro"         | 1234.56       | €1,234.56 |
| "gbp"                   | 1234.56       | £1,234.56 |
| "jpy" or "yen"          | 1234.56       | ¥1,235    |
| "inr"                   | 1234.56       | ₹1,234.56 |

Two notes on Frank's page change how you use it. The humanize option "will ignore any precision argument provided", so passing one changes nothing. And the percent option shows 0.856 as 85.6%, so feed it a fraction between 0 and 1, not a value you've already multiplied by 100.

The everyday case is a number inside a sentence. With a Budget of 12500:

```
"Budget: " + formatNumber(prop("Budget"), "usd", 0)
```

That returns "Budget: $12,500". The usd option supplies the dollar sign and the comma, and precision 0 drops the cents. For progress in words, divide first and format the ratio:

```
formatNumber(prop("Done") / prop("Total"), "percent", 0)
```

With 3 of 4 tasks done, the division gives 0.75 and the formula returns "75%". A project with no tasks yet would divide by zero, so I'd check Total first and let that branch return its own text:

```
if(prop("Total") == 0, "No tasks yet", formatNumber(prop("Done") / prop("Total"), "percent", 0))
```

Both branches return text, so the types match.

Frank pitches formatNumber() as a way to get commas and currency "without needing to use complex regular expressions", and Zapier's [roundup of Notion formulas](https://zapier.com/blog/notion-formulas/?ref=notionsolutions.net) shows what that looks like: a profit-and-loss formula that tests the Amount with regular expressions and adds "$" and ".00" by hand. Its author notes the result is text and "doesn't display thousands separators". For positive amounts, `formatNumber(prop("Amount"), "usd")` adds the dollar sign and the comma without a single pattern test. For losses, I'd format the absolute value and let the words carry the sign, as the budget recipe below does, because Frank's examples are all positive numbers.

## formatDate(): write the date the way you read it

formatDate() takes a date and a pattern and returns text. Notion's reference documents the two-argument form and five tokens: "YYYY" for year, "MM" for month, "DD" for day, "h" for hour and "mm" for minute. Its examples turn the same date into "August 30, 2023" with `"MMMM D, Y"` and "08/30/2023" with `"MM/DD/YYYY"`.

Frank's [formatDate() reference](https://thomasjfrank.com/formulas/functions/formatdate/?ref=notionsolutions.net) adds an optional timezone argument and the full token list. He explains that Notion formats dates with the Luxon library while keeping many tokens from its predecessor, Moment.

```
formatDate(date, pattern, timezone?)
date.formatDate(pattern, timezone?)
```

__formatDate() tokens with Thomas Frank's example outputs__
| Token      | Shows                                      | Example                         |
| ---------- | ------------------------------------------ | ------------------------------- |
| ddd / dddd | Day of the week, three letters or in full  | Wed / Wednesday                 |
| D / Do     | Day of the month, plain or with an ordinal | 21 / 21st                       |
| MMM / MMMM | Month name, three letters or in full       | Oct / October                   |
| YY         | Two-digit year                             | 15                              |
| A          | Uppercase AM or PM                         | PM                              |
| LT         | Short time with AM or PM                   | 4:08 PM                         |
| wo         | Week of the year with an ordinal           | 4th                             |
| LL / ll    | Long or short localized date               | October 21, 2015 / Oct 21, 2015 |

Square brackets print words as written instead of reading them as tokens. Frank's `formatDate(now(), "[Month of] MMMM, YYYY")` returns "Month of June, 2022". For a task list, a short weekday and month reads fastest:

```
formatDate(prop("Due"), "ddd, MMM D")
```

With Due set to November 14, 2026, that returns "Sat, Nov 14". By default, Frank notes, formatDate() shows dates in your system's timezone. Pass a zone such as "America/Chicago" or "UTC-5" as the third argument when everyone should read one clock. The [dateBetween off-by-one guide](https://notionsolutions.net/notion-datebetween-off-by-one/) covers when the clock and timezone change the result.

The result is text, and Frank spells out what that blocks. Date math fails on it, and dateAdd() reports "Argument of type text does not satisfy function dateAdd." Equality checks work, but earlier-than and later-than comparisons get "much more difficult". And "it is also not possible to create date-based filters in a database view" on a formula that outputs a formatDate() string. So do the date math first and format at the very end. If you have to go back, Frank's route is parseDate() on a date written as "YYYY-MM-DD". The [guide to formula date errors](https://notionsolutions.net/notion-formula-date-errors/) walks through calculating before formatting.

## style() and unstyle(): bold, color and highlight

style() adds formatting to text. Notion's reference lists the formatting styles "b" (bold), "u" (underline), "i" (italics), "c" (code) and "s" (strikethrough), and nine colors: gray, brown, orange, yellow, green, blue, purple, pink and red. Adding "\_background" to a color gives a highlight instead of colored letters.

```
style("Notion", "b", "u")
style("Notion", "blue", "gray_background")
"Tony Tony Chopper".style("s", "yellow_background")
```

Frank's [style() reference](https://thomasjfrank.com/formulas/functions/style/?ref=notionsolutions.net) fills in the rules Notion leaves out. Each style or color is its own argument, and "the order of the arguments does not matter." A string carries one text color and one background color; add two text colors and "the last argument will be used." He also lists "default" as a text color, with no background version.

For a status badge, ifs() picks the label and style() dresses it:

```
ifs(
  prop("Status") == "Blocked", style("Blocked", "red", "b"),
  prop("Status") == "In review", style("In review", "yellow_background"),
  format(prop("Status"))
)
```

A blocked task shows "Blocked" in bold red, a task in review gets a yellow highlight, and every other status passes through plain. The last line uses format() so every branch returns text. Notion's [formulas help](https://www.notion.com/help/formulas?ref=notionsolutions.net) styles its overdue label the same way, with `style("Overdue", "red", "b")`. The [if() and ifs() guide](https://notionsolutions.net/notion-formula-if-ifs/) covers the condition side, including why the order of the lines decides the label.

unstyle() reverses it. Per Notion's reference, `unstyle("Text")` removes every style and `unstyle("Text", "b")` removes only bold. Frank's [unstyle() example](https://thomasjfrank.com/formulas/functions/unstyle/?ref=notionsolutions.net) takes a bold, struck-through name, removes "s" and leaves it bold. I'd use it when a formula reuses text that already carries styles and the new spot needs it plain.

style() is part of the formula's result, so the color lives in the property. Conditional color is a different tool: a setting on one view. Notion's [database properties help](https://www.notion.com/help/database-properties?ref=notionsolutions.net) lists Formulas among the properties a rule can use, and says the color fills a page's entire background, with property-only coloring limited to table views. For a red word in one column, I'd use style(). For a row or card that should stand out in a particular view, I'd keep the label plain and add a rule, which the [conditional color guide](https://notionsolutions.net/notion-conditional-color-in-views/) sets up.

## Number format setting or formatNumber()?

If the result is a number and nothing else, leave it a number and set its look in the property. Use formatNumber() only when the number has to sit inside words. The question to ask is what the column has to answer: "How much is left across all projects?" needs a number the Calculate row can add, while "Is this project over budget?" reads better as a sentence.

Notion documents these display settings on number-type properties. The database properties help says Number values "can also be formatted as currency or progress bars", and the [rollups help](https://www.notion.com/help/relations-and-rollups?ref=notionsolutions.net) has you pick "the number formatting you want to display" and "the decimal point placement you want to set" after choosing Sum. For a formula, easlo's [large progress bar walkthrough](https://www.easlo.co/blog/notion-formulas-create-a-large-progress-bar-in-notion?ref=notionsolutions.net) shows the same kind of setting: once the progress formula, which already rounds its result, is set up, "you should see the option to update the Number format to Percent", and from there you select Bar with the Large style.

Keeping the number keeps everything that needs one: the column's arithmetic in Calculate, other formulas that do math with it, and easlo's Bar, which sits on that Number format. If you only want fewer decimals, round() keeps the value numeric; Notion's reference shows `round(1.234, 2) = 1.23`.

__Number format setting or formatNumber(): which to use__
| What the property should show       | Use                                                              | Why                                                       |
| ----------------------------------- | ---------------------------------------------------------------- | --------------------------------------------------------- |
| A total you add up under the column | A formula that returns a number                                  | Text output loses Calculate's arithmetic options          |
| Progress as a bar                   | A formula that returns a number, Number format Percent, then Bar | easlo's walkthrough builds the bar from the Number format |
| Fewer decimals, still a number      | round(value, 2)                                                  | The result stays a number                                 |
| A sum of related pages              | A rollup with a Number format and decimal places                 | Notion's rollups help documents both settings             |
| A number inside a sentence          | formatNumber()                                                   | Only text can sit next to words                           |
| A colored amount                    | formatNumber() then style()                                      | Notion's own example chains the two                       |

Mixed branches cause the same loss without any formatting function. Ben Borowski's [Notion Mastery walkthrough of Formulas 2.0](https://notionmastery.com/everything-new-in-notion-formulas-2-0/?ref=notionsolutions.net) says `if(now() > prop("Birthday"), 1, "A")` can now be written safely, then warns that "the data will be coerced to a string, so you will not be able to use number formatting on the 1." Keep every branch of a number formula numeric and leave the words to a label formula.

When a view needs both, I'd split the job into two formula properties. Budget left does the math and returns a number:

```
prop("Budget") - prop("Spent")
```

Budget label reads it and returns the words:

```
formatNumber(prop("Budget left"), "usd", 0) + " left"
```

Totals and later formulas use Budget left, and the view people read shows Budget label. For progress bars, the [repeat() progress bar guide](https://notionsolutions.net/notion-formula-repeat-progress-bar/) compares the native Bar with a text bar drawn by a formula.

[![Two lanes: a Budget left formula kept as a number works with Calculate Sum, other formulas and a Percent Bar, while a formatNumber() label reads "$2,700 left" but can't be summed](https://storage.ghost.io/c/5c/30/5c30c46b-86a3-4d20-984f-4f6ae8ad1ed2/content/images/2026/10/notion-formula-format-style-number-or-label.webp)](https://storage.ghost.io/c/5c/30/5c30c46b-86a3-4d20-984f-4f6ae8ad1ed2/content/images/2026/10/notion-formula-format-style-number-or-label.webp?ref=notionsolutions.net)

A number keeps Sum, math and the Bar display; a label reads well in a sentence but stops calculating, so Budget left feeds Budget label.

## When formatted output goes wrong: symptoms and fixes

Each problem below traces back to one rule or to a documented limit of one function. format(), formatNumber() and formatDate() hand back text, and text can't do what a number or a date can. Find your symptom in the first column.

__Formatting symptoms, their causes and fixes__
| Symptom                                               | Cause                                                                                                             | Fix                                                                                              |
| ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| "Total: 12500" with no comma or dollar sign           | Joining a number to text gives the stored digits; Notion's format(1234) returns "1234"                            | Wrap the number in formatNumber(prop("Budget"), "usd", 0)                                        |
| No Sum or Average in the column's Calculate menu      | The formula returns text; Frank says Calculate then "won't offer arithmetic options"                              | Return the number in one formula and build the words in a label formula                          |
| dateAdd() error after formatDate()                    | formatDate() returns text: "Argument of type text does not satisfy function dateAdd."                             | Do date math first and format last; use parseDate() on a "YYYY-MM-DD" string if you must go back |
| A date filter can't use the formula                   | Frank: date-based filters can't use a formula that outputs a formatDate() string                                  | Filter on the Date property, or on a formula that returns a date                                 |
| The percent comes out 100 times too large             | The percent option expects a fraction: 0.856 shows as 85.6%, so a value already multiplied by 100 is scaled twice | Feed a 0 to 1 ratio such as Done / Total, or divide by 100 first                                 |
| Only one of two colors shows                          | One text color and one background color per string; the last one wins                                             | Keep one text color and add a \_background color for the second                                  |
| A later formula can't multiply the result             | It's text; toNumber("2") = 2 parses plain digits, but "$12,500" also holds a sign and a comma                     | Point the later formula at the numeric property, not the label                                   |
| Number formatting stops working after you add an if() | A number branch next to a text branch is coerced to text                                                          | Return the same type from every branch                                                           |

The pattern behind most rows is the same: the label became the source of truth for something that needed a number. Moving the math back to a number property fixes the symptom and keeps the next formula from hitting it.

## Four formatting recipes and what they return

Rename the properties to match your database. Each output below follows from the documented rules above, and you can check any recipe against your own rows: open the formula editor from a database row, and Notion's formulas help says you'll "see a live preview of the result of the formula for that row."

### An invoice line

```
format(prop("Qty")) + " × " + formatNumber(prop("Rate"), "usd", 0) + " = " + formatNumber(prop("Qty") * prop("Rate"), "usd", 0)
```

With Qty 3 and Rate 120, it returns "3 × $120 = $360". The multiplication happens on numbers inside formatNumber(), so the total is correct before it becomes text. Set precision to 2 if your rates carry cents.

### A due label

```
if(empty(prop("Due")), "No due date", "Due " + formatDate(prop("Due"), "ddd, MMM D"))
```

A task due November 14, 2026 reads "Due Sat, Nov 14"; one due November 20 reads "Due Fri, Nov 20". A task without a date says "No due date" instead of leaving a gap. Filter on Due itself, since this label is text.

### Budget left, red when it's over

```
lets(
  remaining, prop("Budget") - prop("Spent"),
  amount, formatNumber(abs(remaining), "usd", 0),
  if(remaining >= 0, amount + " left", style("Over by " + amount, "red", "b"))
)
```

With Budget 12500 and Spent 9800, remaining is 2700 and the label reads "$2,700 left". With Spent 13100, remaining is -600; abs() makes it 600, and the label reads "Over by $600" in bold red. The sign never reaches formatNumber(), and the words say which way the budget went. The [let() and lets() guide](https://notionsolutions.net/notion-formula-let/) explains how the second name reuses the first.

### A compact count

```
formatNumber(prop("Downloads"), "humanize") + " downloads"
```

1234567 downloads read "1.2M downloads", matching Frank's humanize example. "compact" is the same option under another name, and both ignore any precision you pass.

__What each recipe returns for sample values__
| Recipe            | Inputs                    | Output                 | How the output follows                                          |
| ----------------- | ------------------------- | ---------------------- | --------------------------------------------------------------- |
| Budget sentence   | Budget 12500              | Budget: $12,500        | usd adds the sign and comma; precision 0 drops the decimals     |
| Percent done      | Done 3, Total 4           | 75%                    | 3 / 4 = 0.75, which percent shows as 75%                        |
| Invoice line      | Qty 3, Rate 120           | 3 × $120 = $360        | 3 × 120 = 360, calculated before formatting                     |
| Due label         | Due November 14, 2026     | Due Sat, Nov 14        | November 14, 2026 is a Saturday; ddd and MMM give three letters |
| Due label         | Due November 20, 2026     | Due Fri, Nov 20        | November 20, 2026 is a Friday                                   |
| Budget left       | Budget 12500, Spent 9800  | $2,700 left            | 12500 - 9800 = 2700                                             |
| Budget left, over | Budget 12500, Spent 13100 | Over by $600, bold red | 12500 - 13100 = -600; abs() gives 600                           |
| Compact count     | Downloads 1234567         | 1.2M downloads         | Frank's humanize example                                        |

## Keep the number, format the label

Formatting is the last step in a Notion formula. The functions handle the look: formatNumber() adds the commas and currency that format() never will, formatDate() writes any pattern you can spell with tokens, and style() colors the result. Where the number ends and the text begins is your decision. I'd keep every calculation in a property that returns a number or a date, and give each view that needs words one label formula on top.

Start with one formula. Find the one in your database that glues a number to text, such as `"Total: " + prop("Budget")`, and replace the bare number with `formatNumber(prop("Budget"), "usd", 0)`. If anything else uses that formula's result for a total or more math, point it at the number instead.