121 lines
2.7 KiB
Plaintext
121 lines
2.7 KiB
Plaintext
DataSection
|
|
numberNames:
|
|
;small
|
|
Data.s "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"
|
|
Data.s "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
|
|
;tens
|
|
Data.s "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
|
|
;big, non-Chuquet system
|
|
Data.s "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion"
|
|
Data.s "septillion", "octillion", "nonillion", "decillion", "undecillion", "duodecillion"
|
|
Data.s "tredecillion"
|
|
EndDataSection
|
|
|
|
Procedure.s numberWords(number.s)
|
|
;handles integers from -1E45 to +1E45
|
|
Static isInitialized = #False
|
|
Static Dim small.s(19)
|
|
Static Dim tens.s(9)
|
|
Static Dim big.s(14)
|
|
|
|
If Not isInitialized
|
|
Restore numberNames
|
|
For i = 1 To 19
|
|
Read.s small(i)
|
|
Next
|
|
For i = 2 To 9
|
|
Read.s tens(i)
|
|
Next
|
|
For i = 1 To 14
|
|
Read.s big(i)
|
|
Next
|
|
isInitialized = #True
|
|
EndIf
|
|
|
|
For i = 1 To Len(number)
|
|
If Not FindString("- 0123456789", Mid(number,i,1), 1)
|
|
number = Left(number, i - 1) ;trim number to the last valid character
|
|
Break ;exit loop
|
|
EndIf
|
|
Next
|
|
|
|
Protected IsNegative = #False
|
|
number = Trim(number)
|
|
If Left(number,1) = "-"
|
|
IsNegative = #True
|
|
number = Trim(Mid(number, 2))
|
|
EndIf
|
|
|
|
If CountString(number, "0") = Len(number)
|
|
ProcedureReturn "zero"
|
|
EndIf
|
|
|
|
If Len(number) > 45
|
|
ProcedureReturn "Number is too big!"
|
|
EndIf
|
|
|
|
Protected num.s = number, output.s, unit, unitOutput.s, working
|
|
|
|
Repeat
|
|
working = Val(Right(num, 2))
|
|
unitOutput = ""
|
|
Select working
|
|
Case 1 To 19
|
|
unitOutput = small(working)
|
|
Case 20 To 99
|
|
If working % 10
|
|
unitOutput = tens(working / 10) + "-" + small(working % 10)
|
|
Else
|
|
unitOutput = tens(working / 10)
|
|
EndIf
|
|
EndSelect
|
|
|
|
working = Val(Right(num, 3)) / 100
|
|
If working
|
|
If unitOutput <> ""
|
|
unitOutput = small(working) + " hundred " + unitOutput
|
|
Else
|
|
unitOutput = small(working) + " hundred"
|
|
EndIf
|
|
EndIf
|
|
|
|
If unitOutput <> "" And unit > 0
|
|
unitOutput + " " + big(unit)
|
|
If output <> ""
|
|
unitOutput + ", "
|
|
EndIf
|
|
EndIf
|
|
|
|
output = unitOutput + output
|
|
|
|
If Len(num) > 3
|
|
num = Left(num, Len(num) - 3)
|
|
unit + 1
|
|
Else
|
|
Break ;exit loop
|
|
EndIf
|
|
ForEver
|
|
|
|
If IsNegative
|
|
output = "negative " + output
|
|
EndIf
|
|
|
|
ProcedureReturn output
|
|
EndProcedure
|
|
|
|
Define n$
|
|
If OpenConsole()
|
|
Repeat
|
|
Repeat
|
|
Print("Give me an integer (or q to quit)! ")
|
|
n$ = Input()
|
|
Until n$ <> ""
|
|
|
|
If Left(Trim(n$),1) = "q"
|
|
Break ;exit loop
|
|
EndIf
|
|
PrintN(numberWords(n$))
|
|
ForEver
|
|
CloseConsole()
|
|
EndIf
|