Por exemplo:
1.
>>> milhares_com_virgulas(
1234
)
2.
'1,234'
3.
>>> milhares_com_virgulas(
123456789
)
4.
'123,456,789'
5.
>>> milhares_com_virgulas(
12
)
6.
'12'
Estes exemplo são elucidativos do que se pretende e também dos casos que têm que se ter em conta. Existem várias maneiras de resolver o problema. Pense um pouco antes de olhar para a solução e procure desenvolver a sua solução.
01.
def
milhares_com_virgulas(num):
02.
# muda representação
03.
cadeia
=
list(str(num))
04.
# calcula resultado
05.
resultado
=
''
06.
while
len(cadeia) >
3
:
07.
aux
=
','
+
''.join(cadeia[len(cadeia)
-
3
:])
08.
resultado
=
aux
+
resultado
09.
cadeia
=
cadeia[:
-
3
]
10.
resultado
=
''.join(cadeia)
+
resultado
11.
return
resultado
A nossa solução faz uso de uma mudança de representação e dos comandos str, list e join para comutar entre números, listas e cadeias de caracteres. Socorre-se também de uma variável acumulador onde vamos construindo o resultado.
Algo que me ocorreu sem grande porquê, a quem interesse:
ResponderEliminarO principal problema que encontrei na programação, nesta cadeira, é a fase da resolução de problemas: Perceber o problema, e como resolve-lo, é obviamente importante, mas mais difícil de fazer do que parece, e o resultado é dar voltas desnecessárias, duplicando ou triplicando as linhas de código, e exponenciando a probabilidade de nos "perdermos"..
def milhares_com_virgulas(numero):
ResponderEliminarnum=str(numero)
li=[]
for i in range(0,len(num)+1,3):
li.append(num[i:i+3])
string=','.join(li)
return string
Não é uma solução correcta visto que conta do inicio para o fim e não do fim para o inicio como fazemos para contar milhares e separar. Mas como seria uma possivel resoluçao partindo desta ideia. Não consigo resolver...
Obrigado :)
Realmente o seu programa é uma boa aproximação. Mas tem alguns problemas. O ciclo for não é a melhor solução pois obriga a muita ginástica! Mas comecemos pela questão da ordem. Basta percorrer o número do fim para o princípio:
ResponderEliminardef milhares_com_virgulas(numero):
num=str(numero)
li = []
for i in range(len(num),0,-3):
li.append(num[i-3:i])
string = ','.join(li[::-1])
return string
Mas ficamos com o problema da parte inicial por resolver. Basta experimentar com um número com menos de três dígitos. Então, temos que prever esse caso:
def milhares_com_virgulas(numero):
num=str(numero)
if len(num) < 3:
return str(num)
else:
li = []
for i in range(len(num),0,-3):
li.append(num[i-3:i])
aux = len(num)%3
string = num[:aux] + ','.join(li[::-1])
return string
E pronto, agora funciona.
Mas existe uma outra solução, mais elegante. Só que é recursiva... Aqui vai, para quem se interessa por estas coisas:
def milhares_com_virgulas_rec(numero):
if numero == 0:
return ''
elif numero < 1000:
return str(numero)
else:
return milhares_com_virgulas(numero/1000) + ',' + str(numero%1000)
notar como partimos o número em duas partes: uma primeira com todos os dígitos menos os três últimos, e uma segunda com o três últimos dígitos. Notar como garantimos que o 0 não dá problema. Espero ter ajudado!