¿Cómo puedo formatear un número decimal para que 32757121.33
se muestre como 32.757.121,33
?
Utilice locale.format()
:
>>> import locale >>> locale.setlocale(locale.LC_ALL, 'German') 'German_Germany.1252' >>> print(locale.format('%.2f', 32757121.33, True)) 32.757.121,33
Puede restringir los cambios de la configuración regional a la visualización de valores numéricos (cuando se usa locale.format()
, locale.str()
etc.) y dejar la configuración de la configuración regional no afectada:
>>> locale.setlocale(locale.LC_NUMERIC, 'English') 'English_United States.1252' >>> print(locale.format('%.2f', 32757121.33, True)) 32,757,121.33 >>> locale.setlocale(locale.LC_NUMERIC, 'German') 'German_Germany.1252' >>> print(locale.format('%.2f', 32757121.33, True)) 32.757.121,33
He encontrado otra solución:
'{:,.2f}'.format(num).replace(".","%").replace(",",".").replace("%",",")
Si no puedes o no quieres usar la locale
por alguna razón, también puedes hacerlo con una expresión regular:
import re def sep(s, thou=",", dec="."): integer, decimal = s.split(".") integer = re.sub(r"\B(?=(?:\d{3})+$)", thou, integer) return integer + dec + decimal
sep()
toma la representación de cadena de un flotador de Python estándar y la devuelve con miles de separadores decimales personalizados.
>>> s = "%.2f" % 32757121.33 >>> sep(s) '32,757,121.33' >>> sep(s, thou=".", dec=",") '32.757.121,33'
Explicación:
\B # Assert that we're not at the start of the number (?= # Match at a position where it's possible to match... (?: # the following regex: \d{3} # 3 digits )+ # repeated at least once $ # until the end of the string ) # (thereby ensuring a number of digits divisible by 3