Repository: majiidd/persiantools (language: python)

Issue:
add float number to word
I add a new feature - add convert float number to word.



Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index c062185..a956759 100644
--- a/README.md
+++ b/README.md
@@ -110,6 +110,9 @@ Based on python `strftime()` behavior
 >>> digits.to_word(9512026)
 'نه میلیون و پانصد و دوازده هزار و بیست و شش'
 
+>>> digits.to_word(15.007)
+'پانزده و هفت هزارم'
+
 >>> characters.ar_to_fa("كيك")
 'کیک'
 ```
diff --git a/persiantools/__init__.py b/persiantools/__init__.py
index 3e083e3..428b5c0 100644
--- a/persiantools/__init__.py
+++ b/persiantools/__init__.py
@@ -7,7 +7,7 @@
 
 __title__ = "persiantools"
 __url__ = "https://github.com/majiidd/persiantools"
-__version__ = "2.3.2"
+__version__ = "2.4.0"
 __build__ = __version__
 __author__ = "Majid Hajiloo"
 __author_email__ = "majid.hajiloo@gmail.com"
diff --git a/persiantools/digits.py b/persiantools/digits.py
index 69844af..14c1dd1 100644
--- a/persiantools/digits.py
+++ b/persiantools/digits.py
@@ -1,3 +1,5 @@
+from decimal import Decimal
+
 from persiantools import utils
 
 EN_TO_FA_MAP = {
@@ -53,6 +55,22 @@
 HUNDREDS = ("یکصد", "دویست", "سیصد", "چهارصد", "پانصد", "ششصد", "هفتصد", "هشتصد", "نهصد")
 RANGE = ("ده", "یازده", "دوازده", "سیزده", "چهارده", "پانزده", "شانزده", "هفده", "هجده", "نوزده")
 BIG_RANGE = (" هزار", " میلیون", " میلیارد", " تریلیون")
+MANTISSA = (
+    "دهم",
+    "صدم",
+    "هزارم",
+    "ده هزارم",
+    "صد هزارم",
+    "یک میلیونیم",
+    "ده میلیونیم",
+    "صد میلیونیم",
+    "یک میلیاردم",
+    "ده میلیاردم",
+    "صد میلیاردم",
+    "تریلیونیم",
+    "ده تریلیونیم",
+    "صد تریلیونیم",
+)
 ZERO = "صفر"
 DELI = " و "
 NEGATIVE = "منفی "
@@ -146,8 +164,30 @@ def _to_word(number: int, depth: bool) -> str:
     raise OutOfRangeException("number must be lower than 1000000000000000")
 
 
-def to_word(number: int) -> str:
-    if not isinstance(number, int):
-        raise TypeError("number must be integer")
-
-    return _to_word(number, False)
+def _floating_number_to_word(number: float, depth: bool) -> str:
+    left, right = str(abs(number)).split(".")
+    if len(right) > 14:
+        raise OutOfRangeException("You are allowed to use 14 digits for a floating point")
+
+    if len(str(right).strip("0")) > 0:
+        left_word = _to_word(int(left), False)
+        result = "{}{} {}".format(
+            left_word + DELI if left_word != ZERO else "",
+            _to_word(int(right), False),
+            MANTISSA[len(str(right).rstrip("0")) - 1],
+        )
+        if number < 0:
+            return NEGATIVE + result
+        return result
+    else:
+        if number < 0:
+            return NEGATIVE + (_to_word(int(left), False))
+        return _to_word(int(left), False)
+
+
+def to_word(number: (float, int)) -> str:
+    if isinstance(number, int):
+        return _to_word(number, False)
+    elif isinstance(number, float):
+        return _floating_number_to_word(number, False)
+    raise TypeError("number must be digit")


Test patch:
diff --git a/tests/test_digits.py b/tests/test_digits.py
index 41c8c02..a34da76 100644
--- a/tests/test_digits.py
+++ b/tests/test_digits.py
@@ -50,6 +50,14 @@ def test_to_letter(self):
         self.assertEqual(digits.to_word(100000000000004), "یکصد تریلیون و چهار")
 
         self.assertEqual(digits.to_word(-305), "منفی سیصد و پنج")
+        self.assertEqual(digits.to_word(10.02), "ده و دو صدم")
+        self.assertEqual(digits.to_word(15.007), "پانزده و هفت هزارم")
+        self.assertEqual(digits.to_word(12519.85), "دوازده هزار و پانصد و نوزده و هشتاد و پنج صدم")
+        self.assertEqual(digits.to_word(123.50), "یکصد و بیست و سه و پنج دهم")
+
+        self.assertEqual(
+            digits.to_word(-0.1554845), "منفی یک میلیون و پانصد و پنجاه و چهار هزار و هشتصد و چهل و پنج ده میلیونیم"
+        )
 
         with pytest.raises(digits.OutOfRangeException):
             digits.to_word(1000000000000001)