웹 개발을 하다보면 숫자를 출력할 일이 참 많습니다. 그런데, 사람이 읽기에는 콤마(,)가 있는 편이 읽기 편합니다. PHP에는 number_format이란 함수가 있어서 그 역할을 합니다. Django의 경우 humanize contrib에 intcomma라는 fliter가 존재하지만 Flask에는 마땅히 그 역할을 해주는 내장 함수가 없습니다.

1. 가장 쉽게

가장 쉬운 방법은 그냥 템플릿 문법 내에서 Python formatting을 사용하는 것입니다.

# render_template_string은 별도로 파일을 여러개 만들지 않고 소스 내에서 템플릿을 보여주기 위해서 사용했습니다.
# 보통 render_template를 써도 똑같이 작동합니다.
from flask import Flask, render_template_string

app = Flask(__name__)

template = """
Hello {{ '{:,}'.format(num) }}
"""

@app.route('/')
def index():
    return render_template_string(template, num=123456789012345)

2. Jinja2의 filter를 이용

1번 방법은 매우 손쉽지만 매번 format을 적기 귀찮다고 생각할 수 있습니다. 그런 경우 이 방법을 추천드립니다.

from flask import Flask, render_template_string

app = Flask(__name__)
app.debug = True

template = """
Hello {{ num | number_format }}
"""

def number_format_simple(value):
    return '{:,}'.format(value)

app.jinja_env.filters['number_format'] = number_format_simple

@app.route('/')
def index():
    return render_template_string(template, num=123456789012345)

app.jinja_env.filters에 추가하는 방법 대신 @app.template_filter('number_format') 과 같이 decorator를 사용해서 추가할 수도 있습니다.

3. Babel을 써서 locale에 대응하기

이 방법은 매우 편리해서 자주 써먹을수 있겠지만 이 방법으로는 다국어 사이트를 다룰 수 없습니다. 왜냐하면 한국에서는 천의 자리마다 콤마(,)를 넣지만 다른 나라는 .를 넣기도 합니다. 이 경우, babel을 사용하면 이 문제를 해결할 수 있습니다.

# 시스템의 기본 locale을 가져오기 위해 locale 모듈을 사용합니다.
import locale

# babel은 숫자 출력으로 format_number, format_decimal, format_percent를 지원합니다. 필요에 따라 적당한걸 사용하면 됩니다.
from babel.numbers import format_number
from flask import Flask, render_template_string

app = Flask(__name__)
app.debug = True

# 테스트를 위해 언어를 늘렸어요
template = """
Hello {{ num | number_format }}<br>
안녕 {{ num | number_format('ko_KR') }}<br>
Guten Tag {{ num | number_format('de_DE') }}
"""

def number_format(value, locale_=None):
    if locale_ is None:
        locale_ = locale.getlocale()[0]
    return format_number(value, locale=locale_)

app.jinja_env.filters['number_format'] = number_format

@app.route('/')
def index():
    return render_template_string(template, num=123456789012345)

결과

결과를 보면 독일(de_DE)의 경우는 표기가 다른 것을 확인할 수 있습니다.