Number names: Difference between revisions

621 bytes removed ,  14 years ago
Line 291:
 
=={{header|AutoHotkey}}==
<lang autohotkey>;Loop spaces{ get ignored and the triplets get concatenated by AutoHotkey ; TEST LOOP
n =
; when passing the parameter to the function
Random Digits, 1, 36 ; random number with up to 36 digits
MsgBox, % Spell(1 000 000 000 000 001)
Loop %Digits% {
MsgBox, % Spell(1 000 000 000 000 000)
Random Digit, 0, 9 ; can have leading 0s
MsgBox, % Spell( 912 557 846 343 497)
: n .= 2 ? "two"Digit
}
MsgBox 1, Number Names, % PrettyNumber(n) "`n`n" Spell(n) "`n`n"
IfMsgBox Cancel, Break
}
 
Spell(n) { ; recursive function to spell out the name of a max 36 digit integer, after leading 0s removed
Static p1=" thousand ",p2=" million ",p3=" billion ",p4=" trillion ",p5=" quadrillion ",p6=" quintillion "
, p7=" sextillion ",p8=" septillion ",p9=" octillion ",p10=" nonillion ",p11=" decillion "
, t2="twenty",t3="thirty",t4="forty",t5="fifty",t6="sixty",t7="seventy",t8="eighty",t9="ninety"
, o0="zero",o1="one",o2="two",o3="three",o4="four",o5="five",o6="six",o7="seven",o8="eight"
, o9="nine",o10="ten",o11="eleven",o12="twelve",o13="thirteen",o14="fourteen",o15="fifteen"
, o16="sixteen",o17="seventeen",o18="eighteen",o19="nineteen"
 
n :=RegExReplace(n,"^0+(\d)","$1") ; remove leading 0s from n
;---------------------------------------------------------------------------
Spell(n) { ; recursive function
;---------------------------------------------------------------------------
If (n > 10**15)
Return, "Number too big"
 
If (n11 < d := 10**15(StrLen(n)-1)//3) ; #of digit groups of 3
Return, "oneNumber quadrilliontoo big"
 
If (d) ; more than 3 digits
r := Mod(n, 10**12)
Return, Spell(SubStr(n,1,-3*d)) " million"p%d% (r > 0(s:=SubStr(n,1-3*d)) ? ", " Spell(rs) : "")
If d := Floor(n / 10**12)
Return, Spell(d) " trillion" (r > 0 ? ", " Spell(r) : "")
 
ri := ModSubStr(n, 10**91,1)
If d := Floor(n /> 10**999) ; 3 digits
Return, Spell(d)o%i% " billionhundred" (r > 0(s:=SubStr(n,2)) ? ", and " Spell(rs) : "")
 
If (n > 19) ; n = 20..99
r := Mod(n, 10**6)
If d Return t%i% ((o:= FloorSubStr(n,2)) /? "-" o%o% : 10**6"")
Return, Spell(d) " million" (r > 0 ? ", " Spell(r) : "")
 
r := Mod(n, 10**3)
If d := Floor(n / 10**3)
Return, Spell(d) " thousand" (r > 0 ? ", " Spell(r) : "")
 
r := Mod(n, 100)
If d := Floor(n / 100)
Return, Spell_Digit(d) " hundred" (r > 0 ? " and " Spell(r) : "")
 
r := Mod(n, 10)
If d := Floor(n / 10) > 1
Return, Spell_Tens(d) (r > 0 ? "-" Spell_Digit(r) : "")
 
Return, Spell_Digit(n)
}
 
Return o%n% : "nineteen" ; n = 0..19
;---------------------------------------------------------------------------
Spell_Tens(n) {
;---------------------------------------------------------------------------
Return, n = 2 ? "twenty"
: n = 3 ? "thirty"
: n = 4 ? "forty"
: n = 5 ? "fifty"
: n = 6 ? "sixty"
: n = 7 ? "seventy"
: n = 8 ? "eighty"
: "ninety"
}
 
PrettyNumber(n) { ; inserts thousands separators into a number string
;---------------------------------------------------------------------------
Return RegExReplace( RegExReplace(n,"^0+(\d)","$1"), "\G\d+?(?=(\d{3})+(?:\D|$))", "$0,")
Spell_Digit(n) {
;---------------------------------------------------------------------------
Return, n = 1 ? "one"
: n = 2 ? "two"
: n = 3 ? "three"
: n = 4 ? "four"
: n = 5 ? "five"
: n = 6 ? "six"
: n = 7 ? "seven"
: n = 8 ? "eight"
: n = 9 ? "nine"
: n = 10 ? "ten"
: n = 11 ? "eleven"
: n = 12 ? "twelve"
: n = 13 ? "thirteen"
: n = 14 ? "fourteen"
: n = 15 ? "fifteen"
: n = 16 ? "sixteen"
: n = 17 ? "seventeen"
: n = 18 ? "eighteen"
: "nineteen"
}</lang>
 
138

edits