https://github.com/twcclegg/libphonenumber-csharp
Offical C# port of https://github.com/googlei18n/libphonenumber
https://github.com/twcclegg/libphonenumber-csharp
csharp e164 java-source libphonenumber phone-number phonenumbers
Last synced: 6 months ago
JSON representation
Offical C# port of https://github.com/googlei18n/libphonenumber
- Host: GitHub
- URL: https://github.com/twcclegg/libphonenumber-csharp
- Owner: twcclegg
- License: apache-2.0
- Created: 2015-08-15T23:46:33.000Z (over 10 years ago)
- Default Branch: main
- Last Pushed: 2025-07-08T08:06:42.000Z (6 months ago)
- Last Synced: 2025-07-08T09:25:44.897Z (6 months ago)
- Topics: csharp, e164, java-source, libphonenumber, phone-number, phonenumbers
- Language: C#
- Homepage:
- Size: 77.2 MB
- Stars: 845
- Watchers: 26
- Forks: 159
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://ci.appveyor.com/project/twcclegg/libphonenumber-csharp/branch/main)
[](https://codecov.io/gh/twcclegg/libphonenumber-csharp)
[](https://www.nuget.org/packages/libphonenumber-csharp/)
C# port of Google's [libphonenumber library](https://github.com/google/libphonenumber).
The code was rewritten from the Java source mostly unchanged, please refer to the original documentation for sample code and API documentation.
The original Apache License 2.0 was preserved.
See [this](csharp/README.md) for details about the port.
Phone number metadata is updated in the Google repo approximately every two weeks. This library is automatically updated by a [scheduled github action](https://github.com/twcclegg/libphonenumber-csharp/actions/workflows/create_new_release_on_new_metadata_update.yml) to include the latest metadata, usually within a day.
## Installation
Run the following command to add this library to your project
```
dotnet add package libphonenumber-csharp
```
Available on NuGet as package [`libphonenumber-csharp`](https://www.nuget.org/packages/libphonenumber-csharp).
## Examples
### Parsing a phone number
```csharp
using PhoneNumbers;
var phoneNumberUtil = PhoneNumberUtil.GetInstance();
var e164PhoneNumber = "+44 117 496 0123";
var nationalPhoneNumber = "2024561111";
var smsShortNumber = "83835";
var phoneNumber = phoneNumberUtil.Parse(e164PhoneNumber, null);
phoneNumber = phoneNumberUtil.Parse(nationalPhoneNumber, "US");
phoneNumber = phoneNumberUtil.Parse(smsShortNumber, "US");
```
### Formatting a phone number
```csharp
using PhoneNumbers;
var phoneNumberUtil = PhoneNumberUtil.GetInstance();
var phoneNumber = phoneNumberUtil.Parse("+14156667777", "US");
var formattedPhoneNumber = phoneNumberUtil.Format(phoneNumber, PhoneNumberFormat.INTERNATIONAL);
var formattedPhoneNumberNational = phoneNumberUtil.Format(phoneNumber, PhoneNumberFormat.NATIONAL);
Console.WriteLine(formattedPhoneNumber.ToString()); // +1 415-666-7777
Console.WriteLine(formattedPhoneNumberNational.ToString()); // (415) 666-7777
```
### Check if a phone number is valid
```csharp
using PhoneNumbers;
var phoneNumberUtil = PhoneNumberUtil.GetInstance();
var phoneNumber = phoneNumberUtil.Parse("+14156667777", "US");
var isValid = phoneNumberUtil.IsValidNumber(phoneNumber);
Console.WriteLine(isValid); // true
```
### Get the type of a phone number
```csharp
using PhoneNumbers;
var phoneNumberUtil = PhoneNumberUtil.GetInstance();
var phoneNumber = phoneNumberUtil.Parse("+14156667777", "US");
var numberType = phoneNumberUtil.GetNumberType(phoneNumber);
Console.WriteLine(numberType); // PhoneNumberType.FIXED_LINE_OR_MOBILE
```
See [PhoneNumberType.cs](csharp/PhoneNumbers/PhoneNumberType.cs) for the various possible types of phone numbers
### Get the region code for a phone number
```csharp
using PhoneNumbers;
var phoneNumberUtil = PhoneNumberUtil.GetInstance();
var phoneNumber = phoneNumberUtil.Parse("+14156667777", null);
var regionCode = phoneNumberUtil.GetRegionCodeForNumber(phoneNumber);
Console.WriteLine(regionCode); // US
```
## Features
* Parsing/formatting/validating phone numbers for all countries/regions of the world.
* GetNumberType - gets the type of the number based on the number itself; able to distinguish Fixed-line, Mobile, Toll-free, Premium Rate, Shared Cost, VoIP and Personal Numbers (whenever feasible).
* IsNumberMatch - gets a confidence level on whether two numbers could be the same.
* GetExampleNumber/GetExampleNumberByType - provides valid example numbers for 218 countries/regions, with the option of specifying which type of example phone number is needed.
* IsPossibleNumber - quickly guessing whether a number is a possible phone number by using only the length information, much faster than a full validation.
* AsYouTypeFormatter - formats phone numbers on-the-fly when users enter each digit.
* FindNumbers - finds numbers in text input
See [PhoneNumberUtil.cs](csharp/PhoneNumbers/PhoneNumberUtil.cs) for the various methods and properties available.
## Why keep libphonenumber-csharp up to date?
A lot of the functionality depends on updated metadata that is published by the google repository, see example [here](https://github.com/google/libphonenumber/releases/tag/v8.13.55).
This means that if you don't keep the package up to date, methods like `IsValidNumber` will return false for newer numbers that rely on the updated metadata
Therefore, we recommend you keep this nuget package as up to date as possible using automated means (such as dependabot) as metadata changes published by the google repository is frequent, usually a few times a month.
For more information on metadata usage, please refer to the [main repository faq](https://github.com/google/libphonenumber/blob/master/FAQ.md#metadata)
## ToDo
* port read / write source xml data to binary for better performance and smaller .nupkg size (WIP)
* update / add / port new unit tests and logging from java source
## How to unfold automatic generated files
* Install Jetbrains - Resharper for Visual Studio
* File by file, right click and "Cleanup code"
* Check the unfolded file
## Running tests locally
To run tests locally, you will need a zip version of the `geocoding.zip` file stored in the `resources` folder
and `testgeocoding.zip` file stored in the `resources/test` folder.
On linux, you can run the following commands to generate the zip accordingly
```bash
(cd resources/geocoding; zip -r ../../resources/geocoding.zip *)
(cd resources/test/geocoding; zip -r ../../../resources/test/testgeocoding.zip *)
```
For windows, you can use the following powershell script
```powershell
Compress-Archive -Path "resources\geocoding\*" -DestinationPath "resources\geocoding.zip"
Compress-Archive -Path "resources\test\geocoding\*" -DestinationPath "resources\test\testgeocoding.zip"
```
## Contributing
See [CONTRIBUTING.md](CONTRIBUTING.md)
## Donations
[](https://www.buymeacoffee.com/tclegg)