Formato de un número de teléfono sin decorar en django?

Tengo un número de teléfono lleno o ‘DB DB como cadenas, todos tienen el formato 1112223333, me gustaría mostrarlo como 111-222-3333 en mi plantilla de django

Se que puedo hacer

n = contacts.objects.get(name=name) n.phone = n.phone[:3] + '-' + n.phone[3:6] + '-' + n.phone[6:] 

¿Pero hay una forma mejor / más python?

Solo una solución más:

 n.phone = "%c%c%c-%c%c%c-%c%c%c%c" % tuple(map(ord, n.phone)) 

o

 n.phone = "%s%s%s-%s%s%s-%s%s%s%s" % tuple(n.phone) 

Puede ser excesivo para su caso de uso si todos sus números tienen el mismo formato, pero podría considerar el uso del módulo de números telefónicos . Le permitiría agregar funcionalidades (por ejemplo, números de teléfono internacionales, formatos diferentes, etc.) de manera muy sencilla.

Puedes analizar tus números de esta manera:

 >>> import phonenumbers >>> parsed_number = phonenumbers.parse('1112223333', 'US') >>> parsed_number PhoneNumber(country_code=1, national_number=1112223333L, extension=None, italian_leading_zero=False, country_code_source=None, preferred_domestic_carrier_code=None) 

Luego, para formatearlo como quieras, puedes hacer esto:

 >>> phonenumbers.format_number(parsed_number, phonenumbers.PhoneNumber()) u'111-222-3333' 

Tenga en cuenta que puede utilizar fácilmente otros formatos:

 >>> phonenumbers.format_number(parsed_number, phonenumbers.PhoneNumberFormat.NATIONAL) u'(111) 222-3333' >>> phonenumbers.format_number(parsed_number, phonenumbers.PhoneNumberFormat.INTERNATIONAL) u'+1 111-222-3333' >>> phonenumbers.format_number(parsed_number, phonenumbers.PhoneNumberFormat.E164) u'+11112223333' 

Esto es un poco tardío, pero pensé que de todos modos publicaría mi solución. Es super simple y aprovecha la creación de sus propias tags de plantilla (para usarlas en todo su proyecto). La otra parte de esto es usar el paréntesis alrededor del código de área.

 from django import template register = template.Library() def phonenumber(value): phone = '(%s) %s - %s' %(value[0:3],value[3:6],value[6:10]) return phone register.filter('phonenumber', phonenumber) 

Para el rest de su proyecto, todo lo que necesita hacer es {{ var|phonenumber }}

Ya que estamos hablando de Pythonic :), es un buen hábito usar siempre join lugar de la sum ( + ) para unir cadenas :

 phone = n.phone n.phone = '-'.join((phone[:3],phone[3:6],phone[6:])) 
 def formatPhone(phone): formatted = '' i = 0 # clean phone. skip not digits phone = ''.join(x for x in phone if x.isdigit()) # set pattern if len(phone) > 10: pattern = 'X (XXX) XXX-XX-XX' else: pattern = 'XXX-XXX-XX-XX' # reverse phone = phone[::-1] pattern = pattern[::-1] # scan pattern for p in pattern: if i >= len(phone): break # skip non X if p != 'X': formatted += p continue # add phone digit formatted += phone[i] i += 1 # reverse again formatted = formatted[::-1] return formatted 

imprimir en formato de teléfono (‘7-111-222-33-44’)

7 (111) 222-33-44

imprimir en formato de teléfono (‘222-33-44’)

222-33-44

imprimir en formato de teléfono (‘23344’)

2-33-44