Skip to main content

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

📋 Import Methods

1. Import Specific Function (Recommended)

from lka_nic_decoder import decode_nic
info = decode_nic("912680444V")

2. Import Entire Module

import lka_nic_decoder
info = lka_nic_decoder.decode_nic("912680444V")

3. Import Multiple Functions

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")

4. Import with Alias

from lka_nic_decoder import decode_nic as decode
info = decode("912680444V")

5. Import Validation Function

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}")

6. Import Dataclass for Type Hints

from lka_nic_decoder import NICInfo, decode_nic

def process_nic(nic: str) -> NICInfo:
    return decode_nic(nic)

7. Import Constants

from lka_nic_decoder import DEFAULT_NIC_DAY_OFFSET, nic_to_date
custom_date = nic_to_date(1991, 268, offset=DEFAULT_NIC_DAY_OFFSET)

8. Error Handling Pattern

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}")

📘 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 is 2.

Returns:

  • NICInfo object containing:
    • nic_type (str): "Old NIC" or "New NIC"
    • gender (str): "Male" or "Female"
    • birth_year (int): Year of birth
    • raw_day_code (int): Original 3-digit day code from NIC
    • day_code (int): Adjusted day code (after gender correction)
    • birth_date (date): Full date of birth as datetime.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 birth
  • day_code (int): Adjusted day-of-year code
  • offset (int, optional): NIC system day offset (default 2)

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lka_nic_decoder-1.0.10.tar.gz (6.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lka_nic_decoder-1.0.10-py3-none-any.whl (6.0 kB view details)

Uploaded Python 3

File details

Details for the file lka_nic_decoder-1.0.10.tar.gz.

File metadata

  • Download URL: lka_nic_decoder-1.0.10.tar.gz
  • Upload date:
  • Size: 6.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.0

File hashes

Hashes for lka_nic_decoder-1.0.10.tar.gz
Algorithm Hash digest
SHA256 9c6d90643dd72fcf33a4b824187aa0bceed5d54b4ed0760ab5f95b61d8820a2b
MD5 658458d89d752bab25152962d2cc1387
BLAKE2b-256 7dfe148e7416a32f57dd952320f2bb65e6e9e8657e929f6986e366c4f057e3ed

See more details on using hashes here.

File details

Details for the file lka_nic_decoder-1.0.10-py3-none-any.whl.

File metadata

File hashes

Hashes for lka_nic_decoder-1.0.10-py3-none-any.whl
Algorithm Hash digest
SHA256 3ea5016f18c368f12143370cb90f97ff353fd31d2cd17058d895c0a5329644c1
MD5 17d6d1cb2e30767001e0293d02115997
BLAKE2b-256 7ac232b2c647fb17ff298b58399fa7b97ee620cae2203f03c163490a8d1745e2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page