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.
β 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
pip install lka-nic-decoderfrom 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-05from lka_nic_decoder import decode_nic
info = decode_nic("912680444V")import lka_nic_decoder
info = lka_nic_decoder.decode_nic("912680444V")from lka_nic_decoder import decode_nic, parse_nic_base, nic_to_date
info = decode_nic("912680444V")
nic_type, year, day_code = parse_nic_base("912680444V")from lka_nic_decoder import decode_nic as decode
info = decode("912680444V")from lka_nic_decoder import is_valid_nic, decode_nic
if is_valid_nic("912680444V"):
info = decode_nic("912680444V")
print(f"Valid NIC: {info.birth_date}")from lka_nic_decoder import NICInfo, decode_nic
def process_nic(nic: str) -> NICInfo:
return decode_nic(nic)from lka_nic_decoder import DEFAULT_NIC_DAY_OFFSET, nic_to_date
custom_date = nic_to_date(1991, 268, offset=DEFAULT_NIC_DAY_OFFSET)from lka_nic_decoder import decode_nic, is_valid_nic
try:
if is_valid_nic("912680444V"):
info = decode_nic("912680444V")
print(f"Birth Date: {info.birth_date}")
except ValueError as e:
print(f"Error: {e}")| 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 |
-
Old NIC (10 chars)
-
Year = 1900/2000 + YY
-
Day-of-year = DDD
-
New NIC (12 digits)
-
Year = YYYY
-
Day-of-year = DDD
- If day code > 500 β Female
- Else β Male
- Female NICs subtract 500 from day code
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)- Leap years handled properly
- Month boundaries handled
- No manual month/day mapping needed
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) # 268Converts 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-24Checks 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")) # FalseStores 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-24Follows Semantic Versioning (SemVer):
1.0.18
MIT License β permits both personal and commercial use.
Pull requests welcome!
Open issues for improvements, validation rules, or new features.