feat: add Nepali currency field, number to words, and unicode helpers

This commit is contained in:
sankalp committed 2026-01-30 19:50:45 +05:45
1 parent e606a2b490
commit 12de34e354
5 files changed
+128 -20

No files matched your search

+5 -1
View File
@@ -3,7 +3,11 @@ from django.utils.translation import gettext_lazy as _
from nepali.datetime import nepalidate, nepalidatetime
from django_nepkit.conf import nepkit_settings
from django_nepkit.models import NepaliDateField, NepaliDateTimeField, NepaliCurrencyField
from django_nepkit.models import (
NepaliDateField,
NepaliDateTimeField,
NepaliCurrencyField,
)
from django_nepkit.utils import (
try_parse_nepali_date,
try_parse_nepali_datetime,
+3
View File
@@ -72,6 +72,7 @@ def nepali_humanize(value, threshold=None, format_str=None):
def nepali_currency(value, currency_symbol="Rs."):
"""Format a number with Nepali-style commas and optional currency symbol."""
from django_nepkit.utils import format_nepali_currency
return format_nepali_currency(value, currency_symbol=currency_symbol)
@@ -79,6 +80,7 @@ def nepali_currency(value, currency_symbol="Rs."):
def nepali_words(value):
"""Convert a number to Nepali words."""
from django_nepkit.utils import number_to_nepali_words
return number_to_nepali_words(value)
@@ -86,4 +88,5 @@ def nepali_words(value):
def nepali_unicode(value):
"""Convert English digits to Nepali Unicode."""
from django_nepkit.utils import english_to_nepali_unicode
return english_to_nepali_unicode(value)
+8 -5
View File
@@ -1,24 +1,27 @@
import pytest
from django_nepkit.admin import NepaliModelAdmin
from django_nepkit.models import NepaliCurrencyField
from django.db import models
from django.contrib.admin.sites import AdminSite
class MockModel(models.Model):
amount = NepaliCurrencyField()
class Meta:
app_label = 'django_nepkit'
app_label = "django_nepkit"
class MockAdmin(NepaliModelAdmin):
list_display = ('amount',)
list_display = ("amount",)
def test_admin_currency_formatting():
admin = MockAdmin(MockModel, AdminSite())
displays = admin.get_list_display(None)
# The first item should now be a callable (the display function)
assert callable(displays[0])
# Test the formatter directly
obj = MockModel(amount=1234567)
assert admin.format_nepali_currency(obj.amount) == "Rs. 12,34,567"
+10 -4
View File
@@ -1,7 +1,10 @@
import pytest
from django_nepkit.utils import format_nepali_currency, number_to_nepali_words, english_to_nepali_unicode
from django_nepkit.utils import (
format_nepali_currency,
number_to_nepali_words,
english_to_nepali_unicode,
)
from django_nepkit.models import NepaliCurrencyField
from django.db import models
def test_format_nepali_currency():
assert format_nepali_currency(1234567) == "Rs. 12,34,567.00"
@@ -10,6 +13,7 @@ def test_format_nepali_currency():
assert format_nepali_currency(100.5) == "Rs. 100.50"
assert format_nepali_currency(None) == ""
def test_number_to_nepali_words():
assert number_to_nepali_words(0) == "शून्य"
assert number_to_nepali_words(1) == "एक"
@@ -23,16 +27,18 @@ def test_number_to_nepali_words():
assert number_to_nepali_words(1234567) == "बाह्र लाख चौंतीस हजार पाँच सय सतसट्ठी"
# Note: 12,34,567 -> 12 Lakhs 34 Thousand 5 Hundred 67
def test_english_to_nepali_unicode():
assert english_to_nepali_unicode("123") == "१२३"
assert english_to_nepali_unicode("Price: 100") == "Price: १००"
assert english_to_nepali_unicode(None) == ""
def test_nepali_currency_field():
field = NepaliCurrencyField(max_digits=10, decimal_places=2)
assert field.max_digits == 10
assert field.decimal_places == 2
default_field = NepaliCurrencyField()
assert default_field.max_digits == 19
assert default_field.decimal_places == 2
+102 -10
View File
@@ -143,16 +143,108 @@ def number_to_nepali_words(number: Any) -> str:
if num == 0:
return "शून्य"
ones = ["", "एक", "दुई", "तीन", "चार", "पाँच", "छ", "सात", "आठ", "नौ", "दश",
"एघार", "बाह्र", "तेह्र", "चौध", "पन्ध्र", "सोह्र", "सत्र", "अठार", "उन्नाइस", "बीस",
"एकाइस", "बाइस", "तेईस", "चौबीस", "पच्चीस", "छब्बीस", "सत्ताइस", "अठाइस", "उनन्तीस", "तीस",
"एकतीस", "बत्तीस", "तेत्तीस", "चौंतीस", "पैंतीस", "छत्तीस", "सैंतीस", "अठतीस", "उनन्चालीस", "चालीस",
"एकचालीस", "बयालीस", "त्रिचालीस", "चवालीस", "पैंतालीस", "छयालीस", "सत्तालीस", "अठचालीस", "उनन्पचास", "पचास",
"एकाउन्न", "बाउन्न", "त्रिपन्न", "चउन्न", "पचपन्न", "छपन्न", "सन्ताउन्न", "अन्ठाउन्न", "उनन्साठी", "साठी",
"एकसाठी", "बासट्ठी", "त्रिसट्ठी", "चौसट्ठी", "पैंसट्ठी", "छयसट्ठी", "सतसट्ठी", "अठसट्ठी", "उनन्सत्तरी", "सत्तरी",
"एकहत्तर", "बाहत्तर", "त्रिहत्तर", "चौरहत्तर", "पचहत्तर", "छयहत्तर", "सतहत्तर", "अठहत्तर", "उनन्असी", "असी",
"एकासी", "बयासी", "त्रियासी", "चौरासी", "पचासी", "छयासी", "सतासी", "अठासी", "उनन्नब्बे", "नब्बे",
"एकानब्बे", "बयानब्बे", "त्रियानब्बे", "चौरानब्बे", "पञ्चानब्बे", "छ्यानब्बे", "सन्तानब्बे", "अन्ठानब्बे", "उनन्सय"]
ones = [
"",
"एक",
"दुई",
"तीन",
"चार",
"पाँच",
"छ",
"सात",
"आठ",
"नौ",
"दश",
"एघार",
"बाह्र",
"तेह्र",
"चौध",
"पन्ध्र",
"सोह्र",
"सत्र",
"अठार",
"उन्नाइस",
"बीस",
"एकाइस",
"बाइस",
"तेईस",
"चौबीस",
"पच्चीस",
"छब्बीस",
"सत्ताइस",
"अठाइस",
"उनन्तीस",
"तीस",
"एकतीस",
"बत्तीस",
"तेत्तीस",
"चौंतीस",
"पैंतीस",
"छत्तीस",
"सैंतीस",
"अठतीस",
"उनन्चालीस",
"चालीस",
"एकचालीस",
"बयालीस",
"त्रिचालीस",
"चवालीस",
"पैंतालीस",
"छयालीस",
"सत्तालीस",
"अठचालीस",
"उनन्पचास",
"पचास",
"एकाउन्न",
"बाउन्न",
"त्रिपन्न",
"चउन्न",
"पचपन्न",
"छपन्न",
"सन्ताउन्न",
"अन्ठाउन्न",
"उनन्साठी",
"साठी",
"एकसाठी",
"बासट्ठी",
"त्रिसट्ठी",
"चौसट्ठी",
"पैंसट्ठी",
"छयसट्ठी",
"सतसट्ठी",
"अठसट्ठी",
"उनन्सत्तरी",
"सत्तरी",
"एकहत्तर",
"बाहत्तर",
"त्रिहत्तर",
"चौरहत्तर",
"पचहत्तर",
"छयहत्तर",
"सतहत्तर",
"अठहत्तर",
"उनन्असी",
"असी",
"एकासी",
"बयासी",
"त्रियासी",
"चौरासी",
"पचासी",
"छयासी",
"सतासी",
"अठासी",
"उनन्नब्बे",
"नब्बे",
"एकानब्बे",
"बयानब्बे",
"त्रियानब्बे",
"चौरानब्बे",
"पञ्चानब्बे",
"छ्यानब्बे",
"सन्तानब्बे",
"अन्ठानब्बे",
"उनन्सय",
]
units = [
("", ""),