如何在Django中格式化未装饰的电话号码?
我有一个数据库,里面满是电话号码,都是像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)