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

Diferenças para "FormatarNumeros"

Diferenças entre as versões de 9 e 10
Revisão 9e 2008-09-26 14:06:29
Tamanho: 1222
Editor: localhost
Comentário: converted to 1.6 markup
Revisão 10e 2009-05-02 02:19:21
Tamanho: 2348
Comentário:
Deleções são marcadas assim. Adições são marcadas assim.
Linha 42: Linha 42:


=== 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:

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

Agora, com alguns testes:

{{{
'''
    >>> print split1000('1')
    1
    >>> print split1000('100')
    100
    >>> print split1000('1000')
    1,000
    >>> print split1000('10000')
    10,000
    >>> print split1000(str(10**7))
    10,000,000
    
'''

def split1000(s, sep=','):
   return s if len(s) <= 3 else split1000(s[:-3], sep) + sep + s[-3:]
   
if __name__=='__main__':
    import doctest
    doctest.testmod()
}}}

LucianoRamalho

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:

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

Agora, com alguns testes:

'''
    >>> print split1000('1')
    1
    >>> print split1000('100')
    100
    >>> print split1000('1000')
    1,000
    >>> print split1000('10000')
    10,000
    >>> print split1000(str(10**7))
    10,000,000
    
'''     

def split1000(s, sep=','):
   return s if len(s) <= 3 else split1000(s[:-3], sep) + sep + s[-3:]
   
if __name__=='__main__':
    import doctest
    doctest.testmod()

LucianoRamalho