如何在Django中格式化未装饰的电话号码?

9 投票
5 回答
9435 浏览
提问于 2025-04-17 01:50

我有一个数据库,里面满是电话号码,都是像1112223333这样的字符串格式。我想在我的Django模板中把它显示成111-222-3333的样子。

我知道我可以这样做:

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

但是有没有更好或者更符合Python风格的方法呢?

5 个回答

9

这虽然有点晚了,但我还是想分享我的解决方案。其实非常简单,主要是利用了自己创建模板标签的方式(可以在整个项目中使用)。另外一个关键点是把区号用括号括起来。

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 }} 就可以了。

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

撰写回答