Estou tentando imprimir um número inteiro no Python 2.6.1 com vírgulas como separadores de milhares. Por exemplo, quero mostrar o número 1234567
como 1,234,567
. Como eu faria isso? Eu já vi muitos exemplos no Google, mas estou procurando a maneira prática mais simples.
Não precisa ser específico do local para decidir entre pontos e vírgulas. Eu preferiria algo o mais simples possível.
python
number-formatting
Elias Zamaria
fonte
fonte
{val:,}.format(val=val)
f"{2 ** 64 - 1:,}"
Eu fiz isso funcionar:
Claro, você não precisa de suporte à internacionalização, mas é claro, conciso e usa uma biblioteca interna.
PS Esse "% d" é o formatador comum do estilo%. Você pode ter apenas um formatador, mas pode ser o que você precisa em termos de largura de campo e configurações de precisão.
PPS Se você não conseguir
locale
trabalhar, sugiro uma versão modificada da resposta de Mark:A recursão é útil para o caso negativo, mas uma recursão por vírgula parece um pouco excessiva para mim.
fonte
locale
, eu uso o mínimo possível.setlocale
usar o padrão, o que, esperamos, será apropriado.Por ineficiência e ilegibilidade, é difícil de vencer:
fonte
lambda x: (lambda s: ','.join(["%s%s%s" % (x[0], x[1] or '', x[2] or '') for x in itertools.izip_longest(s[::-1][::3], s[::-1][1::3], s[::-1][2::3])])[::-1].replace('-,','-'))(str(x))
apenas para manter o tema da ofuscação.Aqui está o código de agrupamento do código do idioma após remover partes irrelevantes e limpá-lo um pouco:
(O seguinte funciona apenas para números inteiros)
Já existem boas respostas aqui. Eu só quero adicionar isso para referência futura. No python 2.7, haverá um especificador de formato para separador de milhares. De acordo com a documentação do python , funciona assim
No python3.1, você pode fazer o mesmo:
fonte
Estou surpreso que ninguém tenha mencionado que você pode fazer isso com f-strings no Python 3.6 tão fácil quanto isto:
... onde a parte após os dois pontos é o especificador de formato. A vírgula é o caractere separador desejado, portanto,
f"{num:_}"
use sublinhados em vez de vírgula.Isso é equivalente ao uso
format(num, ",")
para versões mais antigas do python 3.fonte
Aqui está uma substituição de regex de uma linha:
Funciona apenas para saídas inegrais:
Ou para carros alegóricos com menos de 4 dígitos, altere o especificador de formato para
%.3f
:NB: Não funciona corretamente com mais de três dígitos decimais, pois tentará agrupar a parte decimal:
Como funciona
Vamos dividir:
fonte
Isto é o que faço para carros alegóricos. Embora, honestamente, não tenha certeza para quais versões ele funciona - estou usando o 2.7:
Retorna: 4.385.893,38
Atualização: recentemente, tive um problema com este formato (não sabia o motivo exato), mas consegui corrigi-lo soltando
0
:fonte
Você também pode usar
'{:n}'.format( value )
para uma representação de localidade. Eu acho que essa é a maneira mais simples de uma solução de localidade.Para obter mais informações, procure
thousands
no Python DOC .Para moeda, você pode usar
locale.currency
, definindo a bandeiragrouping
:Código
Resultado
fonte
Expandindo ligeiramente a resposta de Ian Schneider:
Se você deseja usar um separador de milhares personalizado, a solução mais simples é:
Exemplos
Se você quer uma representação alemã assim, fica um pouco mais complicado:
fonte
'{:_.2f}'.format(12345.6789).replace('.', ',').replace('_', '.')
Tenho certeza de que deve haver uma função de biblioteca padrão para isso, mas foi divertido tentar escrevê-la usando recursão. Aqui está o que eu criei:
Dito isto, se alguém encontrar uma maneira padrão de fazer isso, você deve usá-la.
fonte
Dos comentários para ativar a receita 498181 , refiz o seguinte:
Ele usa o recurso de expressões regulares: lookahead, ou seja,
(?=\d)
para garantir que apenas grupos de três dígitos com um dígito 'depois' deles recebam uma vírgula. Eu digo 'depois' porque a cadeia é inversa neste momento.[::-1]
apenas inverte uma string.fonte
A resposta aceita é boa, mas eu realmente prefiro
format(number,',')
. Mais fácil para mim interpretar e lembrar.https://docs.python.org/3/library/functions.html#format
fonte
Python 3
-
Inteiros (sem decimal):
"{:,d}".format(1234567)
-
Flutuadores (com decimal):
"{:,.2f}".format(1234567)
onde o número anterior
f
especifica o número de casas decimais.-
Bônus
Função de partida rápida e suja para o sistema de numeração lakhs / crores da Índia (12,34,567):
https://stackoverflow.com/a/44832241/4928578
fonte
do Python versão 2.6, você pode fazer isso:
Para versões do Python <2.6 e apenas para sua informação, aqui estão duas soluções manuais: eles transformam flutuadores em ints, mas números negativos funcionam corretamente:
algumas coisas a serem observadas aqui:
E uma versão mais hardcore:
fonte
Sou iniciante em Python, mas um programador experiente. Eu tenho o Python 3.5, então posso usar a vírgula, mas esse é um exercício de programação interessante. Considere o caso de um número inteiro não assinado. O programa Python mais legível para adicionar milhares de separadores parece ser:
Também é possível usar uma compreensão de lista:
Isso é mais curto e pode ser um exemplo, mas você terá que fazer uma ginástica mental para entender por que funciona. Nos dois casos, obtemos:
A primeira versão é a escolha mais sensata, se você deseja que o programa seja entendido.
fonte
Aqui está um que também funciona para carros alegóricos:
Exemplo de uso:
fonte
float2comma(12031023.1323)
retornos: '12, 031,023.132,3 'Um liner para Python 2.5+ e Python 3 (somente int positivo):
fonte
Solução universal
Eu encontrei alguns problemas com o separador de pontos nas respostas votadas com mais frequência anteriores. Projetei uma solução universal onde você pode usar o que quiser como separador de milhar sem modificar o código do idioma . Sei que não é a solução mais elegante, mas faz o trabalho. Sinta-se livre para melhorá-lo!
fonte
Isso ganha dinheiro junto com as vírgulas
fonte
Eu tenho uma versão python 2 e python 3 deste código. Eu sei que a pergunta foi feita para python 2, mas agora (8 anos depois, lol) as pessoas provavelmente estarão usando python 3.
Código Python 3:
Código Python 2: (Editar. O código python 2 não está funcionando. Estou pensando que a sintaxe é diferente).
fonte
Estou usando o python 2.5 para não ter acesso à formatação interna.
Eu olhei para o código do Django intcomma (intcomma_recurs no código abaixo) e percebi que é ineficiente, porque é recursivo e também compilar o regex em cada execução também não é uma coisa boa. Isso não é necessário, pois o django não está realmente focado nesse tipo de desempenho de baixo nível. Além disso, eu esperava um fator de 10 de diferença de desempenho, mas é apenas três vezes mais lento.
Por curiosidade, implementei algumas versões do intcomma para ver quais são as vantagens de desempenho ao usar o regex. Meus dados de teste concluem uma pequena vantagem para esta tarefa, mas surpreendentemente não muito.
Também fiquei satisfeito ao ver o que eu suspeitava: o uso da abordagem xrange reversa é desnecessário no caso sem regex, mas faz com que o código pareça um pouco melhor com o custo de ~ 10% de desempenho.
Além disso, suponho que o que você está passando é uma string e se parece com um número. Resultados indeterminados de outra forma.
E aqui estão os resultados do teste:
fonte
isso é incorporado em python por PEP -> https://www.python.org/dev/peps/pep-0378/
basta usar o formato (1000, ', d') para mostrar um número inteiro com separador de milhares
existem mais formatos descritos no PEP, têm nele
fonte
Aqui está outra variante usando uma função geradora que funciona para números inteiros:
E aqui está um teste:
fonte
Apenas subclasse
long
(oufloat
, ou o que for). Isso é altamente prático, pois dessa forma você ainda pode usar seus números nas operações matemáticas (e, portanto, no código existente), mas todos serão impressos de maneira agradável no seu terminal.fonte
__repr__()
o método correto para substituir? Eu sugeriria substituir__str__()
e sair__repr__()
sozinho, porqueint(repr(number(928374)))
deveria funcionar, masint()
engasgaria com as vírgulas.number(repr(number(928374)))
não funciona, nãoint(repr(number(928374)))
. Mesmo assim, para fazer com que essa abordagem funcione diretamenteprint
, conforme solicitado pelo OP, o__str__()
método deve ser substituído e não substituído__repr__()
. Independentemente disso, parece haver um erro na lógica de inserção de vírgula principal.Itália:
fonte
Para carros alegóricos:
Para ints:
fonte
float('1,234.52'.translate(None, ','))
pode ser mais direto e possivelmente mais rápido.