Jump to content

Number names: Difference between revisions

no edit summary
(→‎{{header|Kotlin}}: Migrate from maps to lists, they are simpler)
No edit summary
Line 4,227:
31337 thirty one thousand, three hundred and thirty seven
987654321 nine hundred and eighty seven million, six hundred and fifty four thousand, three hundred and twenty one
</pre>
 
=={{header|Prolog}}==
<lang prolog>
:- module(spell, [spell/2]).
 
%
% spell numbers up to the nonillions.
%
 
ones(1, "one"). ones(2, "two"). ones(3, "three"). ones(4, "four"). ones( 5, "five").
ones(6, "six"). ones(7, "seven"). ones(8, "eight"). ones(9, "nine"). ones(10, "ten").
 
ones(11, "eleven"). ones(12, "twelve"). ones(13, "thirteen").
ones(14, "fourteen"). ones(15, "fifteen"). ones(16, "sixteen").
ones(17, "seventeen"). ones(18, "eighteen"). ones(19, "nineteen").
 
tens(2, "twenty"). tens(3, "thirty"). tens(4, "forty"). tens(5, "fifty").
tens(6, "sixty"). tens(7, "seventy"). tens(8, "eighty"). tens(9, "ninety").
 
group( 1, 'thousand'). group( 2, "million"). group(3, "bilion").
group( 4, "trillion"). group( 5, "quadrillion"). group(6, "quintillion").
group( 7, "sextilion"). group( 8, "septillion"). group(9, "octillion").
group(10, "nonillion"). group(11, "decillion").
 
spellgroup(N, G) :- G is floor(log10(N) / 3).
 
spell(N, S) :-
N < 0, !,
NegN is -N, spell(NegN, S0),
string_concat("negative ", S0, S).
spell(0, "zero") :- !.
spell(N, S) :- between(1, 19, N), ones(N, S), !.
spell(N, S) :-
N < 100, !,
divmod(N, 10, Tens, Ones),
tens(Tens, StrTens), ones_part(Ones, StrOnes),
string_concat(StrTens, StrOnes, S).
spell(N, S) :-
N < 1000, !,
divmod(N, 100, Hundreds, Tens),
ones(Hundreds, H), string_concat(H, " hundred", StrHundreds),
tens_part(Tens, StrTens),
string_concat(StrHundreds, StrTens, S).
spell(N, S) :-
spellgroup(N, G), group(G, StrG),
M is 10**(3*G), divmod(N, M, Group, Rest),
spell(Group, S1),
spell_remaining(Rest, S2),
format(string(S), "~w ~w~w", [S1, StrG, S2]).
 
ones_part(0, "") :- !.
ones_part(N, S) :-
ones(N, StrN),
string_concat("-", StrN, S).
 
tens_part(0, "") :- !.
tens_part(N, S) :-
spell(N, Tens),
string_concat(" and ", Tens, S).
 
spell_remaining(0, "") :- !.
spell_remaining(N, S) :-
spell(N, Rest),
string_concat(", ", Rest, S).
</lang>
{{Out}}
<pre>
?- use_module(library(spell)).
true.
 
?- spell(0, Txt).
Txt = "zero".
 
?- spell(73, Txt).
Txt = "seventy-three".
 
?- spell(-144001, Txt).
Txt = "negative one hundred and forty-four thousand, one".
 
?- BigPrime is 2**89 - 1, spell(BigPrime, Txt).
BigPrime = 618970019642690137449562111,
Txt = "six hundred and eighteen septillion, nine hundred and seventy sextilion, nineteen quintillion, six hundred and forty-two quadrillion, six hundred and ninety trillion, one hundred and thirty-seven bilion, four hundred and forty-nine million, five hundred and sixty-two thousand, one hundred and eleven".
</pre>
 
357

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.