웹 개발을 하다보면 숫자를 출력할 일이 참 많습니다.
그런데, 사람이 읽기에는 콤마(,
)가 있는 편이 읽기 편합니다.
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
)의 경우는 표기가 다른 것을 확인할 수 있습니다.