python 20 lines · 6 steps

Building a currency Jinja filter in Flask

A custom template filter that safely formats numbers as localized currency inside Jinja templates.

Explained by highlit
1from decimal import Decimal, ROUND_HALF_UP
2 
3from babel.numbers import format_currency
4from flask import Flask
5 
6app = Flask(__name__)
7 
8 
9@app.template_filter("currency")
10def currency(amount, currency_code="USD", locale="en_US"):
11 if amount is None:
12 return ""
13 
14 try:
15 value = Decimal(str(amount))
16 except (TypeError, ValueError):
17 return ""
18 
19 value = value.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
20 return format_currency(value, currency_code, locale=locale)
01 / 01
STEP 01

Walkthrough

Space play step click any line
Three takeaways
  1. 1Registering a template filter lets templates call reusable formatting logic without cluttering view code.
  2. 2Converting through Decimal(str(amount)) avoids the rounding errors that come from binary floats in money math.
  3. 3Guarding against None and bad input keeps a formatting filter from breaking template rendering.

Related explainers

Share this explainer

Here's the card — post it anywhere.

Building a currency Jinja filter in Flask — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code