Форматировать не украшенный номер телефона в Django? - PullRequest
8 голосов
/ 09 сентября 2011

У меня полные номера телефонов DB в виде строк, все они отформатированы как 1112223333, я хотел бы отобразить его как 111-222-3333 в моем шаблоне django

Iзнаю, я могу сделать

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

но есть ли лучший / более питонический способ?

Ответы [ 5 ]

13 голосов
/ 09 сентября 2011

Для вашего случая использования может оказаться излишним, если все ваши номера отформатированы одинаково, но вы можете рассмотреть возможность использования модуля phonenumbers . Это позволит вам очень легко добавить функциональность (например, международные телефонные номера, другое форматирование и т. Д.).

Вы можете проанализировать свои номера следующим образом:

>>> 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)

Затем, чтобы отформатировать его так, как вы хотите, вы можете сделать это:

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

Обратите внимание, что вы можете легко использовать другие форматы:

>>> 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'
8 голосов
/ 09 августа 2012

Это немного запоздало, но я решил в любом случае опубликовать свое решение. Это очень просто и использует преимущества создания собственных шаблонных тегов (для использования в вашем проекте). Другая часть этого использует круглые скобки вокруг кода города.

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)

Для остальной части вашего проекта все, что вам нужно сделать, это {{ var|phonenumber }}

8 голосов
/ 09 сентября 2011

Еще одно решение:

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

или

n.phone = "%s%s%s-%s%s%s-%s%s%s%s" % tuple(n.phone)
6 голосов
/ 09 сентября 2011

Поскольку мы говорим на Pythonic :), это хорошая привычка - всегда использовать join вместо сложения (+) для объединения строк :

phone = n.phone
n.phone = '-'.join((phone[:3],phone[3:6],phone[6:]))
2 голосов
/ 23 февраля 2012
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

формат печатиPhone ('+ 7-111-222-33-44')

7 (111) 222-33-44

формат печатиPhone ('222-33-44')

222-33-44

формат печатиPhone ('23344')

2-33-44

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...