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