Skip to main content
iVentureTeam

monetary

The Monetary widget renders an amount with the record's currency symbol and precision. Most of its behavior comes from the currency, not the field, and that is where teams get surprised.

Odoo 19 sales order line list showing unit price and subtotal columns formatted by the monetary widget with a currency symbol.
Odoo 19 sales order line list showing unit price and subtotal columns formatted by the monetary widget with a currency symbol.

Quick summary

  • monetary formats a number with the record's currency symbol and the currency's decimal precision.
  • The currency comes from a currency_id field on the same record by default; the currency_field option points it elsewhere.
  • Decimals follow the currency, not the field definition, unless you set the undocumented field_digits option.
  • While a user is typing, the symbol is hidden by design; it reappears in readonly display.
  • no_symbol hides the symbol entirely, useful in dense list columns.
  • On plain float or integer fields it still works, it just needs to be told which currency to use.
  • Odoo 20's development branch keeps every option; only parsing internals change.
Studio nameMonetary
Technical namemonetary
Field typesmonetary, float, integer
Viewsform, list, kanban
Moduleweb, present in every Odoo database
Used in core182 occurrences across 27 modules, including point_of_sale, lunch, product, purchase, sale, stock_account
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0, Odoo 17.0, Odoo 16.0
No-code setupYes, via Odoo Studio (Enterprise)
Alternativesfloat, percentage, integer, statinfo

What the Monetary field does

The Monetary widget takes a number and renders it the way an amount should look: thousands separators, the right number of decimals, and the currency symbol on the side the currency defines. It is the default rendering for monetary fields and can be applied to plain float and integer fields too.

The key mental model, read straight from the source: almost everything you see comes from the currency record, not from the field. The symbol, its position, and the decimal precision are properties of the currency in Accounting, Configuration, Currencies. The widget just asks the currency how to format. A monetary field without a reachable currency falls back to a bare number.

What this means for your team

Amount formatting sounds cosmetic until an export goes wrong. A quotation showing 1,500 with no symbol reads as ambiguous to a customer paying in a different currency; a report mixing two-decimal and three-decimal amounts looks unreliable to an auditor. Multi-currency companies live and die by this widget behaving consistently.

The business decisions that reach this widget are real ones. Whether prices show four decimals in purchasing but two in sales is a decimal-precision setting the widget respects. Whether your Vietnamese dong amounts show the symbol before or after the number is a currency setting the widget reads. Getting these right once, centrally, is far cheaper than fixing them report by report.

On implementations, we treat currency precision as a day-one configuration decision, because changing it after months of transactions creates rounding differences that reconciliation then has to explain.

Setting it up in Odoo Studio (no code)

Studio handles the standard case end to end.

  1. Open the form in Studio and drag a Monetary field from the Add a field panel.

  2. Studio creates the amount field and, if the model has no currency field yet, adds currency_id alongside it and places both on the form.

  3. In Properties, the Currency selector appears when the model carries more than one currency field, letting you pick which one drives the formatting.

What Studio cannot do here

Two things stay out of Studio's reach.

Hiding the symbol in a dense list column needs the no_symbol option in XML.

Forcing the field's own decimal setting instead of the currency's needs the undocumented field_digits option, and the decimal precision itself is configured under Settings, Technical, Decimal Accuracy, which is developer-mode territory.

Supported options in Odoo 19

Verified against monetary_field.js in the Odoo 19.0 web module. field_digits is read from extractProps; it appears in no options panel and no documentation.

OptionTypeWhat it does
currency_fieldfield nameName of the many2one currency field on the record that drives symbol and precision. Falls back to the field's own currency_field definition, then to currency_id.(default: currency_id)
no_symbolbooleanNever show the currency symbol, even in readonly display.
hide_trailing_zerosbooleanTrim zeros after the last significant decimal: 1.20 renders as 1.2.
field_digitsbooleanUse the field definition's decimal precision instead of the currency's. Read in extractProps only; it appears in no options panel or documentation.

Precedence, from the source: with field_digits set, decimals come from the field definition; otherwise they come from the currency. The symbol renders only in readonly display and only when a currency is resolved, and no_symbol suppresses it unconditionally.

Working examples

Standard monetary column

<field name="amount_total" widget="monetary"/>

The widget looks for currency_id on the record. Keep that field in the view, invisible is fine:

<field name="currency_id" column_invisible="1"/>

A different currency field

<field name="purchase_price"
       widget="monetary"
       options="{'currency_field': 'company_currency_id'}"/>

Cost in company currency next to a price in customer currency on the same line: two monetary widgets pointing at two currency fields.

No symbol, for dense lists

<field name="amount_untaxed"
       widget="monetary"
       options="{'no_symbol': True}"/>

Field decimals instead of currency decimals

<field name="unit_cost"
       widget="monetary"
       options="{'field_digits': True}"/>

With a field defined as fields.Float(digits="Product Price"), the four-decimal purchase precision now wins over the currency's two decimals. This is how product costs show more precision than invoice totals.

Where the symbol and decimals really come from

Three formatting rules from the source explain nearly every "why does it show like that" question.

The symbol disappears while editing. The formatter is called with noSymbol whenever the field is editable, so users type against a clean number and the symbol returns when the field is saved or readonly. Teams occasionally report this as a bug; it is deliberate.

The currency must be on the record, in the view. The widget resolves the currency from the record's data at render time. If the currency field is not loaded in that view, there is no symbol and the currency's precision cannot apply. This is why core views carry invisible currency_id columns.

Trailing zeros are kept by default. 1.50 renders as 1.50, and the hide_trailing_zeros option flips that to 1.5. Useful for quantity-like monetary values; leave it off for accounting amounts, where 1.5 reads as sloppy.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Options unchanged in the development branch; parsing internals change. See below.
Odoo 19.0VerifiedVerified against the shipped source and tested on a clean database.
Odoo 18.0VerifiedSame options and behavior. No XML changes needed.
Odoo 17.0VerifiedSame options and behavior. No XML changes needed.
Odoo 16.0VerifiedSame options and behavior. No XML changes needed.

Upgrade note. Option names are stable from Odoo 16 through 19, so views carry over. JavaScript patches are another matter: the input handling moved between hook implementations across versions, so anything patching the editing behavior needs re-testing per version.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The changes below are read from the public development branch and are not final until release.

All three documented options survive unchanged: no_symbol, currency_field and hide_trailing_zeros, and field_digits is still read in extractProps. Views should carry over untouched.

The parsing internals change. Typed input is parsed with the generic float parser instead of the dedicated monetary parser, and the component's internals move to the new Owl props system. Neither changes XML, but JavaScript patches against MonetaryField internals will need review, which is exactly the kind of check our Odoo migration team runs before an upgrade.

Common problems and fixes

SymptomCause and fix
No currency symbol showsThe currency field is not present in the view, so the widget cannot resolve a currency at render time. Add the currency field to the view, invisible if you like.
Symbol vanishes while typingBy design: the formatter drops the symbol whenever the field is editable. No fix needed; it returns in readonly display.
Wrong number of decimalsDecimals follow the currency's setting, not the field's digits definition. Either change the currency's decimal places, or set field_digits: True to use the field's precision.
Amounts differ from what was typedThe value is rounded to the effective precision on save. Raise the currency or decimal-accuracy precision if you need more decimals stored.
Widget on a float field shows no symbolPlain floats carry no currency_field definition, and no currency_id exists on the model. Point the widget at a currency with options="{'currency_field': '...'}".

Monetary field vs the alternatives

WidgetBest forKey difference
monetaryAmounts of money anywhere in a viewCurrency-aware: symbol, position and decimals come from the currency record
floatPlain quantities and ratesNo currency logic; precision from the field's digits
percentageRates shown to users as percentDisplays and parses 15% while storing 0.15
integerWhole-number countsNo decimals, no currency
statinfoAn amount inside a smart buttonButton-box display block, not an editable field

The practical test: if the number is an amount of money, use monetary and make sure the currency is reachable. If it is a plain quantity or rate, use float with digits, and if it is a percentage, use percentage so users are not typing 0.15 to mean 15%.

Frequently asked questions

Why does my monetary field show no currency symbol?+
Almost always because the currency field is missing from the view. The widget reads the currency from the record's loaded data; add currency_id (or the relevant currency field) to the view, invisible is fine, and the symbol appears.
How do I change how many decimals an amount shows?+
Decimals come from the currency's Decimal Places setting by default. To use the field's own precision instead, set options="{'field_digits': True}" on the field; the precisions themselves live under Decimal Accuracy in developer mode.
Can I use the monetary widget on a float field?+
Yes. Its supported types are monetary, float and integer. On a float, tell it which currency to use with options="{'currency_field': '...'}", otherwise it renders without a symbol.
How do I hide the currency symbol in a list column?+
Set options="{'no_symbol': True}" on the field. Core does this in dense tables where the currency is obvious from context.
Why does the symbol disappear when I click into the field?+
Deliberate behavior in the source: while the field is editable the value is formatted without the symbol so users type a clean number. It returns when the field is readonly again.
Does the monetary widget convert between currencies?+
No. It only formats the stored number with a currency's symbol and precision. Conversion is business logic on the model, such as computed company-currency fields; the widget then displays whichever field you point it at.

Multi-currency amounts not displaying right?

Missing symbols, wrong decimals, and cost-versus-price precision are configuration problems with real accounting consequences. We set up multi-currency, decimal accuracy and the views on top of them, for teams on Odoo 16 through 19.

Book a free consultation

How this page was produced

The option table was read from the Odoo 19.0 web module source (monetary_field.js), including the extractProps path that accepts the undocumented field_digits, and confirmed on a clean Odoo 19 database, where the screenshot was captured. The symbol-while-editing and trailing-zeros behavior was tested directly. The Odoo 20 section is read from the public development branch and marked as unreleased. Spotted an error? Tell us and we will correct the page.

Get our monthly Odoo & automation digest

One short email per month with practical insights, version updates, and field-tested tips. No fluff, unsubscribe anytime.