【问题标题】:Format an un-decorated phone number in django?在 django 中格式化未修饰的电话号码?
【发布时间】:2011-11-13 07:54:49
【问题描述】:

我有一个 DB chock full o' 电话号码作为字符串,它们的格式都像 1112223333,我想在我的 django 模板中将其显示为 111-222-3333

我知道我能做到

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

但是有没有更好/更 Pythonic 的方式?

【问题讨论】:

  • 你知道它们都是北美10位数字吗?
  • 是的,都是美式电话号码。

标签: python django string


【解决方案1】:

如果您的所有数字都以相同的方式格式化,这可能对您的用例来说是多余的,但您可以考虑使用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'

【讨论】:

  • 我正在使用它,尽管有点矫枉过正,因为这个包看起来很结实,而且我认为它可以比我现在做的验证工作做得更好。我的问题始于格式化,但看起来它还有其他好处。
  • 另外,“键入时格式化”听起来很有用。
【解决方案2】:

只是另一种解决方案:

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)

【讨论】:

  • 实际上这偶尔会出现错误“格式字符串的参数不足”
【解决方案3】:

这有点晚了,但我想我还是会发布我的解决方案。它超级简单,并利用创建您自己的模板标签(用于整个项目)。另一部分是使用区号周围的括号。

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

【讨论】:

  • 没问题 :) 我认为这更适合在 Django 模板中使用
  • 你会把它放在你的 django 项目的什么地方?某种实用程序?
  • 没关系,this 真的很有帮助
【解决方案4】:

因为我们说的是 Pythonic :),所以always use join instead of addition (+) to join strings 是一个好习惯:

phone = n.phone
n.phone = '-'.join((phone[:3],phone[3:6],phone[6:]))

【讨论】:

    【解决方案5】:
    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
    

    打印格式电话('+7-111-222-33-44')

    7 (111) 222-33-44

    打印格式电话('222-33-44')

    222-33-44

    打印格式电话('23344')

    2-33-44

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多