Decode Sri Lankan NIC numbers into birth date, gender, and NIC type
Project description
🇱🇰 Sri Lanka NIC Decoder
Decode Sri Lankan National Identity Card (NIC) numbers into birth date, gender, and NIC type.
This package provides a simple and accurate way to decode both:
- Old NIC format (10 characters →
YYDDDxxxxV) - New NIC format (12 digits →
YYYYDDDxxxx)
The decoder uses Python's datetime module to correctly compute dates, including leap years and month boundaries.
It also implements the correct NIC day-number offset discovered from real NIC examples.
✨ Features
✔ Supports Old and New Sri Lankan NIC formats
✔ Extracts full Date of Birth
✔ Determines Gender (Male / Female)
✔ Automatically identifies NIC type
✔ Correct leap-year handling
✔ Configurable NIC day-code offset (default = 2)
✔ Clean, reusable functions
✔ Includes a structured NICInfo dataclass
📦 Installation
pip install lka-nic-decoder
🔧 Usage Example
from lka_nic_decoder import decode_nic
# Decode an old NIC
info = decode_nic("912680444V")
print(info.nic_type) # Old NIC
print(info.gender) # Male
print(info.birth_year) # 1991
print(info.birth_date) # 1991-09-24
# Decode a new NIC
info_new = decode_nic("199253600001")
print(info_new.nic_type) # New NIC
print(info_new.gender) # Female
print(info_new.birth_year) # 1992
print(info_new.birth_date) # 1992-02-05
📘 What the Decoder Extracts
| Field | Example Value | Description |
|---|---|---|
| NIC Type | Old NIC,New NIC |
Old (10 chars) or New (12 chars) |
| Birth Year | 1991 |
Parsed from NIC digits |
| Gender | Male,Female |
Based on day code (>500 → Female) |
| Birth Date | 1991-09-24 |
Fully computed using datetime |
| Raw Day Code | 268 |
Original 3-digit day component |
| Day Code | 268 / -500 |
Adjusted for females |
🧠 How NIC Decoding Works
1. NIC Type
-
Old NIC (10 chars)
-
Year = 1900/2000 + YY
-
Day-of-year = DDD
-
New NIC (12 digits)
-
Year = YYYY
-
Day-of-year = DDD
2. Gender
- If day code > 500 → Female
- Else → Male
- Female NICs subtract 500 from day code
3. Date Calculation
The NIC system has a known offset of +2 days, so decoding uses:
Date calculation uses:
from datetime import datetime, timedelta
start_of_year = datetime(year, 1, 1)
birth_date = start_of_year + timedelta(days=actual_day_of_year)
This ensures:
- Leap years handled properly
- Month boundaries handled
- No manual month/day mapping needed
📚 Full API Documentation
decode_nic(nic: str, offset: int = 2) -> NICInfo
Main high-level function — decodes a Sri Lankan NIC and returns a NICInfo dataclass.
Parameters:
nic(str): The NIC number to decode (10-character old NIC or 12-digit new NIC).offset(int, optional): Day-of-year offset. Default is2.
Returns:
NICInfoobject containing:nic_type(str):"Old NIC"or"New NIC"gender(str):"Male"or"Female"birth_year(int): Year of birthraw_day_code(int): Original 3-digit day code from NICday_code(int): Adjusted day code (after gender correction)birth_date(date): Full date of birth asdatetime.date
Example:
from lka_nic_decoder import decode_nic
info = decode_nic("912680444V")
print(info.birth_date) # 1991-09-24
### `parse_nic_base(nic: str) -> tuple`
Parses NIC type, birth year, and raw day code without computing the full date.
**Returns:**
```python
(nic_type, birth_year, raw_day_code)
from lka_nic_decoder import parse_nic_base
nic_type, birth_year, day_code = parse_nic_base("912680444V")
print(nic_type) # Old NIC
print(birth_year) # 1991
print(day_code) # 268
nic_to_date(birth_year: int, day_code: int, offset: int = 2) -> date
Converts the day-of-year code to an actual datetime.date.
Parameters:
birth_year(int): Year of birthday_code(int): Adjusted day-of-year codeoffset(int, optional): NIC system day offset (default2)
Example:
from lka_nic_decoder import nic_to_date
from datetime import date
birth_date = nic_to_date(1991, 268)
print(birth_date) # 1991-09-24
is_valid_nic(nic: str) -> bool
Checks if a NIC string is a valid format (10-character old NIC or 12-digit new NIC).
Example:
from lka_nic_decoder import is_valid_nic
print(is_valid_nic("912680444V")) # True
print(is_valid_nic("1234567890")) # True
print(is_valid_nic("ABCDE")) # False
NICInfo Dataclass
Stores all decoded NIC information in a structured object.
from dataclasses import dataclass
from datetime import date
@dataclass(frozen=True)
class NICInfo:
nic_type: str
gender: str
birth_year: int
raw_day_code: int
day_code: int
birth_date: date
from lka_nic_decoder import decode_nic
info = decode_nic("912680444V")
print(info.nic_type) # Old NIC
print(info.gender) # Male
print(info.birth_year) # 1991
print(info.birth_date) # 1991-09-24
🏷️ Versioning
Follows Semantic Versioning (SemVer):
1.0.5
📄 License
MIT License — permits both personal and commercial use.
🤝 Contributing
Pull requests welcome!
Open issues for improvements, validation rules, or new features.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file lka_nic_decoder-1.0.9.tar.gz.
File metadata
- Download URL: lka_nic_decoder-1.0.9.tar.gz
- Upload date:
- Size: 6.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d98f8f9b648b90ad5953ba6ea1e388b6921a65fac555538599d0b5da9ac637a9
|
|
| MD5 |
85fa48caba4c9f0823c3d486f62a8e18
|
|
| BLAKE2b-256 |
d1777ed827847b918b825080b4bdb3402d52cd03326be03a193970659d900e61
|
File details
Details for the file lka_nic_decoder-1.0.9-py3-none-any.whl.
File metadata
- Download URL: lka_nic_decoder-1.0.9-py3-none-any.whl
- Upload date:
- Size: 5.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f60e873d1380fd4126c8eac44653acb07e9979139eadaabe5337805737341e1e
|
|
| MD5 |
f638cee47d380a89bf6345908e017bbd
|
|
| BLAKE2b-256 |
c882d44ad1ce3f6084dffbe940ece2631ec5d8eefd711458075a644adf585486
|