¿Cómo puedo imprimir un flotador con miles de separadores?

¿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