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

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)


rum*_*pel 8

只是另一个解决方案:

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


unu*_*tbu 6

因为我们说的是Pythonic :),所以总是使用join而不是+ add ()来连接字符串是个好习惯:

phone = n.phone
n.phone = '-'.join((phone[:3],phone[3:6],phone[6:]))
Run Code Online (Sandbox Code Playgroud)