Neste exemplo usei o modulo locale para criar formatações de numeros e moedas no padrão do Brasil
Segue abaixo o codigo:
1 #!/usr/bin/env python
2 import locale
3
4 sal=2500.87
5 aumento=0.25
6 perc=10
7 vendas=4800.9
8 prejuizo=-3200
9 print "locale", "=>", locale.setlocale(locale.LC_ALL, "")
10
11 print '------Formato numero Float------'
12 print locale.format("%1.0f",sal,0)
13 print locale.format("%1.2f",sal,0)
14 print locale.format("%1.3f",sal,0)
15 print locale.format("%1.2f",(sal-10000),0)
16
17 print '------Formato numero Porc-------'
18 print locale.format("%2.2f%%",(aumento * 100),0)
19 print locale.format("%2.3f%%",(aumento * 100),0)
20 print locale.format("%1.2f%%",(perc * 100),1)
21 print locale.format("%1.3f%%",(perc * 100),1)
22
23 print '------Formato moeda ------------'
24 info=locale.localeconv()
25 print info['currency_symbol'],locale.format("%1.2f",vendas,1)
26 print info['currency_symbol'],locale.format("%1.3f",vendas,1)
27 print info['currency_symbol'],locale.format("%1.2f",prejuizo,1)
28 print info['currency_symbol'],locale.format("%1.3f",prejuizo,1)
29
30 print 'Simbolo internacional da moeda no pais => ',info["int_curr_symbol"]
Sem depender do locale
É ótimo usar o locale quando podemos, mas em sistemas Web que são daemons (serviços) não é recomendável usar a função setlocale exceto na fase e inicialização do sistema, porque alterar o locale não é thread-safe (inseguro em sistemas multi-threaded) e pode gerar erros.
Então se o locale não está previamente configurado da forma correta, é melhor não depender dele. Eis uma implementação (parcial) de uma função que coloca separadores nos milhares, sem depender do locale:
Fica como exercício para o leitor expandir esta solução para tratar símbolos monetários e casas decimais. Mas a parte mais difícil, que é separar os milhares, já está feita.
Agora, com alguns testes:
1 '''
2 >>> print split1000('1')
3 1
4 >>> print split1000('100')
5 100
6 >>> print split1000('1000')
7 1,000
8 >>> print split1000('10000','.')
9 10.000
10 >>> print split1000(str(10**7), ' ')
11 10 000 000
12
13 '''
14
15 def split1000(s, sep=','):
16 return s if len(s) <= 3 else split1000(s[:-3], sep) + sep + s[-3:]
17
18 if __name__=='__main__':
19 import doctest
20 doctest.testmod()
Existem soluções alternativas para este problema em FormatarNumerosBrasil
Veja também o CookBook.