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

Você não tem permissão para executar esta ação.

Excluir mensagem

FormatarNumeros

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"]

SidneiBrianti

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:

   1 def split1000(s, sep=','):
   2    return s if len(s) <= 3 else split1000(s[:-3], sep) + sep + s[-3:]

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()

LucianoRamalho


Existem soluções alternativas para este problema em FormatarNumerosBrasil

Veja também o CookBook.