associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

FormatarNumerosBrasil

Receita: Formatar números em qualquer linguagem

Existem pelo menos três linguas para as quais o locale.localeconv()['thousands_sep'] é vazio: português 'pt', português brasileiro ('pt_br') e espanhol ('es').

Para estas linguagens as funções abaixo são úteis. A primeira é bem simples (e rápida) mas só formata inteiros positivos. A segunda é bem genérica.

Código

   1 def format_positive_integer(number):
   2 
   3     l = list(str(number))
   4     c = len(l)
   5    
   6     while c > 3:
   7         c -= 3
   8         l.insert(c, '.')
   9 
  10     return ''.join(l)
  11 
  12 def format_number(number, precision=0, group_sep='.', decimal_sep=','):
  13 
  14     number = ('%.*f' % (max(0, precision), number)).split('.')
  15 
  16     integer_part = number[0]
  17     if integer_part[0] == '-':
  18         sign = integer_part[0]
  19         integer_part = integer_part[1:]
  20     else:
  21         sign = ''
  22       
  23     if len(number) == 2:
  24         decimal_part = decimal_sep + number[1]
  25     else:
  26         decimal_part = ''
  27    
  28     integer_part = list(integer_part)
  29     c = len(integer_part)
  30    
  31     while c > 3:
  32         c -= 3
  33         integer_part.insert(c, group_sep)
  34 
  35     return sign + ''.join(integer_part) + decimal_part

Exemplo de uso

   1 if __name__ == '__main__':
   2     for numero in (1,12,123.2,1234,12345.2,123456,1234567.3345,12345678,123456789,1234567890):
   3         print format_number(numero, 2).rjust(16)
   4     for numero in (1,12,123.2,1234,12345,123456,1234567,12345678,123456789,1234567890):
   5         print format_positive_integer(numero).rjust(16)

Existem soluções alternativas para este problema em FormatarNumeros.

Volta para CookBook.


Clodoaldo Pinto Neto