38 lines
2.2 KiB
Plaintext
38 lines
2.2 KiB
Plaintext
fn numToEng num =
|
|
(
|
|
num = num as integer -- convert to int
|
|
local originalNumber = num -- store the initial value, to check if it was negative afterwards
|
|
|
|
num = abs num -- make positive
|
|
local numStr = num as string -- store as string to check the length
|
|
|
|
local nonFirstDigits = (if numStr.count > 3 then ((substring numStr ((if mod numStr.count 3 ==0 then 3 else mod numStr.count 3)+1) -1)) else "0") -- this is the string of the number without the beginning, i.e 123456 will give 456, 12035 will give 2035
|
|
local singleDigits = #("One","Two","Three","Four","Five","Six","Seven","Eight","Nine")
|
|
local ElevenTwenty = #("Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen")
|
|
local tens = #("Ten","Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety")
|
|
local big = #("Hundred","Thousand","Million","Billion")
|
|
local ret = "" -- this is the value to be returned
|
|
|
|
case of
|
|
(
|
|
(num == 0 ): ret += "Zero" -- number is zero
|
|
(num < 10): ret += singleDigits[num] -- number is not and smaller than 10
|
|
(num == 10): ret += tens[1] -- number is 10
|
|
(num < 20): ret += elevenTwenty[abs(10-num)] -- number is between 11 and 19
|
|
(num <= 90 and mod num 10 == 0): ret += tens[num/10] -- number is >= 20 and <= 90 and is dividable by 10
|
|
(num < 100): ret += (numToEng (floor(num/10.0)*10) +" "+ numtoEng (num-(floor(num/10.0))*10)) -- number is >= 20, < 100 and is not dividable by 10
|
|
(num < 1000): ret += (singledigits[floor(num/100) as integer] + " "+big[1]+ (if mod num 100 != 0 then (" and "+numtoeng (num-(floor(num/100.0)*100))) else "")) -- number is >= 100, < 1000
|
|
(num >= 1000): ret += -- number is >= 1000
|
|
(
|
|
numtoeng (substring numStr 1 (if mod numStr.count 3 ==0 then 3 else mod numStr.count 3)) + \
|
|
" " + big[1+((numStr.count-1)/3)] + (if nonFirstDigits as integer == 0 then "" else (if nonFirstDigits as integer < 100 then " and " else ", ")) + \
|
|
(if (mod num 1000 == 0) then "" else (numtoeng nonFirstDigits))
|
|
|
|
)
|
|
)
|
|
|
|
if originalNumber < 0 and (substring ret 1 8) != "Negative" do ret = ("Negative "+ret) -- if number is negative
|
|
ret = (toupper ret[1]) + (tolower (substring ret 2 -1)) -- make the first char uppercase and rest lowercase
|
|
return ret
|
|
)
|