stefanfoulis / django-phonenumber-field

A django model and form field for normalised phone numbers using python-phonenumbers
MIT License
1.48k stars 318 forks source link

[Question] Best way to generae US phonenumber for testing #587

Closed jerinpetergeorge closed 9 months ago

jerinpetergeorge commented 9 months ago

What is the best way to generate a list of US phone numbers, that should be valid per this package?

This is what I have tried,

import random

def generate_random_us_mobile_number():
    # Randomly generate a valid US area code (for example, 3 digits starting with 2, excluding reserved codes)
    area_code = f"{random.randint(201, 999):03d}"

    # Randomly generate the next 7 digits (exchange code + subscriber number)
    exchange_subscriber = f"{random.randint(0, 9999999):07d}"

    # Format the generated number as xxx-xxx-xxxx
    phone_number = f"{area_code[:3]}{exchange_subscriber[:3]}{exchange_subscriber[3:]}"

    return phone_number

# Example usage:

for _ in range(5):
    random_us_mobile_number = generate_random_us_mobile_number()
    random_us_mobile_number = f"+1{random_us_mobile_number}"
    try:
        PhoneNumberField().to_internal_value(data=random_us_mobile_number)
        print(f"Valid - {random_us_mobile_number}")
    except Exception as e:
        print(f"Invalid - {random_us_mobile_number}")

Result

Valid - +12494764554
Valid - +17134633902
Valid - +14074209398
Invalid - +18360782858
Invalid - +12859488242
francoisfreitag commented 9 months ago

This packages relies on libphonenumber. Phone numbers aren’t just digits put together, they have a structure. In the US, the three first number correspond to an area, and many digits between 000 and 999 do not correspond to an area.

Your best bet is probably to use

>>> import phonenumbers
>>> phonenumbers.example_number(region_code='US')
PhoneNumber(country_code=1, national_number=2015550123, extension=None, italian_leading_zero=None, number_of_leading_zeros=None, country_code_source=0, preferred_domestic_carrier_code=None)

You can try modifying the last digits, they usually are the most local part of a phone number. Also, libphonenumbers offers a phonenumbers.example_number_for_type() method. You probably can rely on it to generate different valid phone numbers in a given region.