Skip to content

Commit 12de34e

Browse files
committed
feat: add Nepali currency field, number to words, and unicode helpers
1 parent e606a2b commit 12de34e

5 files changed

Lines changed: 128 additions & 20 deletions

File tree

django_nepkit/admin.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
from nepali.datetime import nepalidate, nepalidatetime
44

55
from django_nepkit.conf import nepkit_settings
6-
from django_nepkit.models import NepaliDateField, NepaliDateTimeField, NepaliCurrencyField
6+
from django_nepkit.models import (
7+
NepaliDateField,
8+
NepaliDateTimeField,
9+
NepaliCurrencyField,
10+
)
711
from django_nepkit.utils import (
812
try_parse_nepali_date,
913
try_parse_nepali_datetime,

django_nepkit/templatetags/nepali.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,18 +72,21 @@ def nepali_humanize(value, threshold=None, format_str=None):
7272
def nepali_currency(value, currency_symbol="Rs."):
7373
"""Format a number with Nepali-style commas and optional currency symbol."""
7474
from django_nepkit.utils import format_nepali_currency
75+
7576
return format_nepali_currency(value, currency_symbol=currency_symbol)
7677

7778

7879
@register.filter
7980
def nepali_words(value):
8081
"""Convert a number to Nepali words."""
8182
from django_nepkit.utils import number_to_nepali_words
83+
8284
return number_to_nepali_words(value)
8385

8486

8587
@register.filter
8688
def nepali_unicode(value):
8789
"""Convert English digits to Nepali Unicode."""
8890
from django_nepkit.utils import english_to_nepali_unicode
91+
8992
return english_to_nepali_unicode(value)
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
1-
import pytest
21
from django_nepkit.admin import NepaliModelAdmin
32
from django_nepkit.models import NepaliCurrencyField
43
from django.db import models
54
from django.contrib.admin.sites import AdminSite
65

6+
77
class MockModel(models.Model):
88
amount = NepaliCurrencyField()
9+
910
class Meta:
10-
app_label = 'django_nepkit'
11+
app_label = "django_nepkit"
12+
1113

1214
class MockAdmin(NepaliModelAdmin):
13-
list_display = ('amount',)
15+
list_display = ("amount",)
16+
1417

1518
def test_admin_currency_formatting():
1619
admin = MockAdmin(MockModel, AdminSite())
1720
displays = admin.get_list_display(None)
18-
21+
1922
# The first item should now be a callable (the display function)
2023
assert callable(displays[0])
21-
24+
2225
# Test the formatter directly
2326
obj = MockModel(amount=1234567)
2427
assert admin.format_nepali_currency(obj.amount) == "Rs. 12,34,567"

django_nepkit/tests/test_currency_and_words.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import pytest
2-
from django_nepkit.utils import format_nepali_currency, number_to_nepali_words, english_to_nepali_unicode
1+
from django_nepkit.utils import (
2+
format_nepali_currency,
3+
number_to_nepali_words,
4+
english_to_nepali_unicode,
5+
)
36
from django_nepkit.models import NepaliCurrencyField
4-
from django.db import models
7+
58

69
def test_format_nepali_currency():
710
assert format_nepali_currency(1234567) == "Rs. 12,34,567.00"
@@ -10,6 +13,7 @@ def test_format_nepali_currency():
1013
assert format_nepali_currency(100.5) == "Rs. 100.50"
1114
assert format_nepali_currency(None) == ""
1215

16+
1317
def test_number_to_nepali_words():
1418
assert number_to_nepali_words(0) == "शून्य"
1519
assert number_to_nepali_words(1) == "एक"
@@ -23,16 +27,18 @@ def test_number_to_nepali_words():
2327
assert number_to_nepali_words(1234567) == "बाह्र लाख चौंतीस हजार पाँच सय सतसट्ठी"
2428
# Note: 12,34,567 -> 12 Lakhs 34 Thousand 5 Hundred 67
2529

30+
2631
def test_english_to_nepali_unicode():
2732
assert english_to_nepali_unicode("123") == "१२३"
2833
assert english_to_nepali_unicode("Price: 100") == "Price: १००"
2934
assert english_to_nepali_unicode(None) == ""
3035

36+
3137
def test_nepali_currency_field():
3238
field = NepaliCurrencyField(max_digits=10, decimal_places=2)
3339
assert field.max_digits == 10
3440
assert field.decimal_places == 2
35-
41+
3642
default_field = NepaliCurrencyField()
3743
assert default_field.max_digits == 19
3844
assert default_field.decimal_places == 2

django_nepkit/utils.py

Lines changed: 102 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,108 @@ def number_to_nepali_words(number: Any) -> str:
143143
if num == 0:
144144
return "शून्य"
145145

146-
ones = ["", "एक", "दुई", "तीन", "चार", "पाँच", "छ", "सात", "आठ", "नौ", "दश",
147-
"एघार", "बाह्र", "तेह्र", "चौध", "पन्ध्र", "सोह्र", "सत्र", "अठार", "उन्नाइस", "बीस",
148-
"एकाइस", "बाइस", "तेईस", "चौबीस", "पच्चीस", "छब्बीस", "सत्ताइस", "अठाइस", "उनन्तीस", "तीस",
149-
"एकतीस", "बत्तीस", "तेत्तीस", "चौंतीस", "पैंतीस", "छत्तीस", "सैंतीस", "अठतीस", "उनन्चालीस", "चालीस",
150-
"एकचालीस", "बयालीस", "त्रिचालीस", "चवालीस", "पैंतालीस", "छयालीस", "सत्तालीस", "अठचालीस", "उनन्पचास", "पचास",
151-
"एकाउन्न", "बाउन्न", "त्रिपन्न", "चउन्न", "पचपन्न", "छपन्न", "सन्ताउन्न", "अन्ठाउन्न", "उनन्साठी", "साठी",
152-
"एकसाठी", "बासट्ठी", "त्रिसट्ठी", "चौसट्ठी", "पैंसट्ठी", "छयसट्ठी", "सतसट्ठी", "अठसट्ठी", "उनन्सत्तरी", "सत्तरी",
153-
"एकहत्तर", "बाहत्तर", "त्रिहत्तर", "चौरहत्तर", "पचहत्तर", "छयहत्तर", "सतहत्तर", "अठहत्तर", "उनन्असी", "असी",
154-
"एकासी", "बयासी", "त्रियासी", "चौरासी", "पचासी", "छयासी", "सतासी", "अठासी", "उनन्नब्बे", "नब्बे",
155-
"एकानब्बे", "बयानब्बे", "त्रियानब्बे", "चौरानब्बे", "पञ्चानब्बे", "छ्यानब्बे", "सन्तानब्बे", "अन्ठानब्बे", "उनन्सय"]
146+
ones = [
147+
"",
148+
"एक",
149+
"दुई",
150+
"तीन",
151+
"चार",
152+
"पाँच",
153+
"छ",
154+
"सात",
155+
"आठ",
156+
"नौ",
157+
"दश",
158+
"एघार",
159+
"बाह्र",
160+
"तेह्र",
161+
"चौध",
162+
"पन्ध्र",
163+
"सोह्र",
164+
"सत्र",
165+
"अठार",
166+
"उन्नाइस",
167+
"बीस",
168+
"एकाइस",
169+
"बाइस",
170+
"तेईस",
171+
"चौबीस",
172+
"पच्चीस",
173+
"छब्बीस",
174+
"सत्ताइस",
175+
"अठाइस",
176+
"उनन्तीस",
177+
"तीस",
178+
"एकतीस",
179+
"बत्तीस",
180+
"तेत्तीस",
181+
"चौंतीस",
182+
"पैंतीस",
183+
"छत्तीस",
184+
"सैंतीस",
185+
"अठतीस",
186+
"उनन्चालीस",
187+
"चालीस",
188+
"एकचालीस",
189+
"बयालीस",
190+
"त्रिचालीस",
191+
"चवालीस",
192+
"पैंतालीस",
193+
"छयालीस",
194+
"सत्तालीस",
195+
"अठचालीस",
196+
"उनन्पचास",
197+
"पचास",
198+
"एकाउन्न",
199+
"बाउन्न",
200+
"त्रिपन्न",
201+
"चउन्न",
202+
"पचपन्न",
203+
"छपन्न",
204+
"सन्ताउन्न",
205+
"अन्ठाउन्न",
206+
"उनन्साठी",
207+
"साठी",
208+
"एकसाठी",
209+
"बासट्ठी",
210+
"त्रिसट्ठी",
211+
"चौसट्ठी",
212+
"पैंसट्ठी",
213+
"छयसट्ठी",
214+
"सतसट्ठी",
215+
"अठसट्ठी",
216+
"उनन्सत्तरी",
217+
"सत्तरी",
218+
"एकहत्तर",
219+
"बाहत्तर",
220+
"त्रिहत्तर",
221+
"चौरहत्तर",
222+
"पचहत्तर",
223+
"छयहत्तर",
224+
"सतहत्तर",
225+
"अठहत्तर",
226+
"उनन्असी",
227+
"असी",
228+
"एकासी",
229+
"बयासी",
230+
"त्रियासी",
231+
"चौरासी",
232+
"पचासी",
233+
"छयासी",
234+
"सतासी",
235+
"अठासी",
236+
"उनन्नब्बे",
237+
"नब्बे",
238+
"एकानब्बे",
239+
"बयानब्बे",
240+
"त्रियानब्बे",
241+
"चौरानब्बे",
242+
"पञ्चानब्बे",
243+
"छ्यानब्बे",
244+
"सन्तानब्बे",
245+
"अन्ठानब्बे",
246+
"उनन्सय",
247+
]
156248

157249
units = [
158250
("", ""),

0 commit comments

Comments
 (0)