在django中格式化未装饰的电话号码?

时间:2011-09-08 20:41:45

标签: python django string

我有一个数据库塞满电话号码作为字符串,它们的格式都是1112223333,我想在我的django模板中将其显示为111-222-3333

我知道我能做到

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

但是有更好/更pythonic的方式吗?

5 个答案:

答案 0 :(得分:13)

如果您的所有数字的格式都相同,则对您的用例可能有点过分,但您可以考虑使用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'

答案 1 :(得分:8)

另外一个解决方案:

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)

答案 2 :(得分:8)

这有点迟了,但我想我还是会发布我的解决方案。它非常简单,可以创建自己的模板标签(在整个项目中使用)。另一部分是使用区号周围的括号。

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

答案 3 :(得分:6)

因为我们说的是Pythonic :),always use join instead of addition (+) to join strings是个好习惯:

phone = n.phone
n.phone = '-'.join((phone[:3],phone[3:6],phone[6:]))

答案 4 :(得分:2)

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
  

print formatPhone('+ 7-111-222-33-44')

     

7(111)222-33-44

     

print formatPhone('222-33-44')

     

222-33-44

     

print formatPhone('23344')

     

2-33-44