JKi*_*rtz 8 python string django
我有一个数据库塞满电话号码作为字符串,它们的格式都是1112223333,我想在我的django模板中显示为111-222-3333
我知道我能做到
n = contacts.objects.get(name=name)
n.phone = n.phone[:3] + '-' + n.phone[3:6] + '-' + n.phone[6:]
Run Code Online (Sandbox Code Playgroud)
但有更好/更pythonic的方式?
jte*_*ace 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)
Run Code Online (Sandbox Code Playgroud)
然后,要按照您希望的方式对其进行格式化,您可以这样做:
>>> phonenumbers.format_number(parsed_number, phonenumbers.PhoneNumber())
u'111-222-3333'
Run Code Online (Sandbox Code Playgroud)
请注意,您可以轻松使用其他格式:
>>> 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'
Run Code Online (Sandbox Code Playgroud)
只是另一个解决方案:
n.phone = "%c%c%c-%c%c%c-%c%c%c%c" % tuple(map(ord, n.phone))
Run Code Online (Sandbox Code Playgroud)
要么
n.phone = "%s%s%s-%s%s%s-%s%s%s%s" % tuple(n.phone)
Run Code Online (Sandbox Code Playgroud)
小智 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)
Run Code Online (Sandbox Code Playgroud)
对于项目的其余部分,您需要做的就是 {{ var|phonenumber }}
因为我们说的是Pythonic :),所以总是使用join
而不是+
add ()来连接字符串是个好习惯:
phone = n.phone
n.phone = '-'.join((phone[:3],phone[3:6],phone[6:]))
Run Code Online (Sandbox Code Playgroud)