我有一个数据库塞满电话号码作为字符串,它们的格式都是1112223333,我想在我的django模板中将其显示为111-222-3333
我知道我能做到
n = contacts.objects.get(name=name)
n.phone = n.phone[:3] + '-' + n.phone[3:6] + '-' + n.phone[6:]
但是有更好/更pythonic的方式吗?
答案 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