我最近开始与 Faker 合作,因为它能够将数据本地化到各个区域。当尝试生成本地化电话号码时,我意识到电话号码有多种格式,如所示。我想知道是否可以将所有生成的电话号码都设置为如下格式:(+91 ##########),无论国家/地区代码如何,它都保持不变。谢谢!
不幸的是,
Faker
没有内置函数来执行此操作。
您有两个选择。
自己写函数,例如:
def fake_phone_number(fake: Faker) -> str:
return f'+91 {fake.msisdn()[3:]}'
from faker import Faker
def main():
fake = Faker()
print(fake_phone_number(fake))
或者创建一个适当的提供程序并建议添加它:https://faker.readthedocs.io/en/master/communityproviders.html
或者
from faker import Faker
from faker.providers.phone_number import Provider
class IndiaPhoneNumberProvider(Provider):
"""
A Provider for phone number.
"""
def india_phone_number(self):
return f'+91 {self.msisdn()[3:]}'
def main():
fake = Faker()
fake.add_provider(IndiaPhoneNumberProvider)
print(fake.india_phone_number())
您可以使用 faker 的 hindi Indian 提供商,它会生成大部分带有 +91 的号码,但不是全部:
带有
faker
和 factoryboy.Faker
的代码示例:
import factory
from faker import Faker
fake = Faker(locale="hi_IN")
fake.phone_number()
# with factory-boy's faker
class New(factory.DictFactory):
phone = factory.Faker("phone_number", locale="hi_IN")
New()
使用效果:
print(fake.phone_number())
>> +91 9018742635
print(New())
>> {'phone': '+91 1489998444'}
如果你想确保每个数字都有+91,你需要用
factoryboy
进行调整,或者用解析函数包裹 fake.phone_number
。
一个巧妙的解决方案可能是使用名为 phonenumbers 的库,如下所示:
import phonenumbers
from faker import Faker
fake = Faker(locale="hi_IN")
number = fake.phone_number()
num_obj = phonenumbers.parse(number, "IN")
interanational_IN_number = phonenumbers.format_number(num_obj, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
print(interanational_IN_number)
这应该在大多数情况下都有效,除了以
091
开头的数字 - 它们应该有两个前导零才能正确识别(0091),解决这个极端情况,然后你就可以开始了。