| 1 | 1 | def say(number): |
| 2 | | pass |
| 2 | if number < 0 or number > 999999999999: |
| 3 | raise ValueError("input out of range") |
| 4 | |
| 5 | if number == 0: |
| 6 | return "zero" |
| 7 | |
| 8 | # Define word mappings |
| 9 | ones = ["", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", |
| 10 | "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", |
| 11 | "seventeen", "eighteen", "nineteen"] |
| 12 | |
| 13 | tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"] |
| 14 | |
| 15 | scales = ["", "thousand", "million", "billion"] |
| 16 | |
| 17 | def convert_hundreds(n): |
| 18 | result = "" |
| 19 | |
| 20 | # Handle hundreds place |
| 21 | if n >= 100: |
| 22 | result += ones[n // 100] + " hundred" |
| 23 | n %= 100 |
| 24 | if n > 0: |
| 25 | result += " " |
| 26 | |
| 27 | # Handle tens and ones place |
| 28 | if n >= 20: |
| 29 | result += tens[n // 10] |
| 30 | if n % 10 > 0: |
| 31 | result += "-" + ones[n % 10] |
| 32 | elif n > 0: |
| 33 | result += ones[n] |
| 34 | |
| 35 | return result |
| 36 | |
| 37 | # Edge Case: Number is zero (already handled above) |
| 38 | # Edge Case: Numbers less than 20 |
| 39 | # Edge Case: Numbers between 20 and 99 |
| 40 | # Edge Case: Numbers between 100 and 999 |
| 41 | # Edge Case: Numbers with zeros in middle positions |
| 42 | |
| 43 | if number < 20: |
| 44 | return ones[number] |
| 45 | |
| 46 | # Break number into groups of three digits |
| 47 | groups = [] |
| 48 | temp_number = number |
| 49 | while temp_number > 0: |
| 50 | groups.append(temp_number % 1000) |
| 51 | temp_number //= 1000 |
| 52 | |
| 53 | # Edge Case: Numbers with leading zeros in groups |
| 54 | # Edge Case: Numbers where some groups are zero (e.g., 1000000) |
| 55 | |
| 56 | result_parts = [] |
| 57 | for i, group in enumerate(groups): |
| 58 | if group > 0: |
| 59 | group_words = convert_hundreds(group) |
| 60 | if i > 0: |
| 61 | group_words += " " + scales[i] |
| 62 | result_parts.append(group_words) |
| 63 | |
| 64 | # Edge Case: Empty result parts (should not happen with valid input) |
| 65 | if not result_parts: |
| 66 | return "zero" |
| 67 | |
| 68 | # Join the parts in reverse order |
| 69 | return " ".join(reversed(result_parts)) |
| 70 | |
| 71 | # Handled Edge Cases: negative numbers, numbers greater than 999,999,999,999, zero, numbers less than 20, numbers between 20 and 99, numbers between 100 and 999, numbers with zeros in middle positions, numbers with leading zeros in groups, numbers where some groups are zero |