Leetcode: 273. Integer to English Words

Problem Statement

Can we break-down the problem in small and easily to solve parts? This is not a question about efficiently, but if you can organize the solution in a handleable way.

class Solution:
    def numberToWords(self, num: int) -> str:
        ntw = {
            0: "Zero",
            1: "One",
            2: "Two",
            3: "Three",
            4: "Four",
            5: "Five",
            6: "Six",
            7: "Seven",
            8: "Eight",
            9: "Nine",
            10: "Ten",
            11: "Eleven",
            12: "Twelve",
            13: "Thirteen",
            14: "Fourteen",
            15: "Fifteen",
            16: "Sixteen",
            17: "Seventeen",
            18: "Eighteen",
            19: "Nineteen",
            20: "Twenty",
            30: "Thirty",
            40: "Forty",
            50: "Fifty",
            60: "Sixty",
            70: "Seventy",
            80: "Eighty",
            90: "Ninety",
        }

        if num in ntw:
            return ntw[num]

        def convert(n):
            if n == 0:
                return []
            if n in ntw:
                return [ntw[n]]
            if n >= 100:
                return [ntw[n // 100], "Hundred"] + convert(n % 100)
            else:
                return [ntw[n - (n % 10)]] + convert(n % 10)

        e = [["Billion"], ["Million"], ["Thousand"], []]
        ans = []
        while num > 0:
            cur = num % 1000
            suf = e.pop()
            if cur > 0:
                ans = convert(cur) + suf + ans
            num = num // 1000
        return " ".join(ans)


assert Solution().numberToWords(123) == "One Hundred Twenty Three"
assert Solution().numberToWords(12345) == "Twelve Thousand Three Hundred Forty Five"
assert (
    Solution().numberToWords(1234567)
    == "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"
)