2012-08-22 2 views
26

쉼표로 구분 된 통화로 부동 서식을 지정하려고합니다. 예 : 543921.9354$543,921.94이됩니다. Jinja 템플릿에서 format 필터를 사용하고 있는데, 연산자를 Python format 함수가 아닌 Python으로 모방 한 것처럼 보입니까?진자 템플릿 - 쉼표로 구분 된 통화로 플로트 서식 지정

진자에서 어떻게이 포맷을 수행 할 수 있습니까? format 필터를 사용할 수 있습니까?

"$%.2f"|format(543921.9354)

물론 수율

$543921.94

답변

39

그에 대한 custom filter 쓰기 : 이것은 내가 쉼표를 제외한 모든을 수행하는, 지금까지 가지고있는 것입니다. 당신은 파이썬 2.7을 사용하는 경우는 다음과 같이 할 수 있습니다

def format_currency(value): 
    return "${:,.2f}".format(value) 
3

를 파이썬 2.6 이상을 사용한다면 새로운 : 당신은 폭 넓은 솔루션으로, 하나 개의 목적을 위해 사용자 정의 필터를 쓸 수 있지만 수

from jinja import Environment, FileSystemLoader 

def format(fmt_str, *args, **kwargs): 
    if args and kwargs: 
     raise jinja2.exceptions.FilterArgumentError(
      "can't handle positional and keyword " 
      "arguments at the same time" 
     ) 
    ufmt_str = jinja2.utils.soft_unicode(fmt_str) 
    if kwargs: 
     return ufmt_str.format(**kwargs) 
    return ufmt_str.format(*args) 


env = Environment(loader=FileSystemLoader('./my/template/dir')) 
env.filters.update({ 
    'format': format, 
}) 

이 기존 format 필터를 교체합니다 (신사 2.7.1 기준) : 당신은 또한 형식 필터 자체를 업데이트 할 수 있습니다. 이 기능의 대부분은 format 소스에서 직접 리핑되었습니다. 이 함수와 jinja의 유일한 차이점은 str.format() 함수를 사용하여 문자열의 서식을 지정한다는 것입니다.

Jinja2 (이 글을 쓰던 당시)가 더 이상 파이썬 2.5를 지원하지 않는다는 것을 알고 있으므로 format 필터가 파이썬의 str.format()을 사용하기 훨씬 전에 오래 걸리지 않을 것이라고 확신합니다.

36

는 업데이트 : Jinja2 파이썬 3를 사용하여,이 모든 사용자 지정 코드를 정의 할 필요없이 템플릿에 아주 능숙했다 :

{{ "${:,.2f}".format(543921.9354) }} 

내가 종속성이 일을 가지고 정확히 모르겠어요,하지만 이 답변을 읽는 다른 사용자는 맞춤 필터에 대해 걱정하기 전에 시도해 보는 것이 좋습니다.

+1

이것은 나를 위해 파이썬 2.7에서도 잘 작동합니다. 좋은 대답! – hamx0r

+0

둥근 부분을 숨기고 십진수 만 표시하는 방법에 대한 아이디어가 있습니까? –

3

내가 확실히 사용자 정의 필터를 작성합니다, vasi의 답변을 @ 알렉스 확장하려면,하지만 나는 또한 통화 그룹 및 심볼을 처리 파이썬 자신의 locale 기능,

def format_currency(value): 
    locale.currency(value, symbol=True, grouping=True) 

중요한 것은에를 사용하십시오 locale을 사용하는 것은 기본 'C'로켈에서 작동하지 않는다는 점에 유의하십시오. 따라서 컴퓨터에서 사용할 수 있도록 설정해야합니다.

당신이 찾고있는 무엇을 위해, 당신은 아마 필요

locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 

하지만 스털링 파운드를 원한다면, 당신이 사용하는 거라고,

locale.setlocale(locale.LC_ALL, 'en_GB.UTF_8') 

.

import locale 
locale.setlocale(locale.LC_ALL, 'en_US') 
locale.currency(543921.94, symbol=True, grouping=True) 
> '$543,921.94' 
locale.setlocale(locale.LC_ALL, 'en_GB') 
> '£543,921.94'