77 lines
1.6 KiB
Erlang
77 lines
1.6 KiB
Erlang
-module(nr2eng).
|
|
-import(lists, [foreach/2, seq/2, append/2]).
|
|
-import(string, [strip/3, str/2]).
|
|
-export([start/0]).
|
|
|
|
sym(1) -> "one";
|
|
sym(2) -> "two";
|
|
sym(3) -> "three";
|
|
sym(4) -> "four";
|
|
sym(5) -> "five";
|
|
sym(6) -> "six";
|
|
sym(7) -> "seven";
|
|
sym(8) -> "eight";
|
|
sym(9) -> "nine";
|
|
sym(10) -> "ten";
|
|
sym(11) -> "eleven";
|
|
sym(12) -> "twelve";
|
|
sym(13) -> "thirteen";
|
|
sym(20) -> "twenty";
|
|
sym(30) -> "thirty";
|
|
sym(40) -> "forty";
|
|
sym(50) -> "fifty";
|
|
sym(100) -> "hundred";
|
|
sym(1000) -> "thousand";
|
|
sym(1000*1000) -> "million";
|
|
sym(1000*1000*1000) -> "billion";
|
|
sym(_) -> "".
|
|
|
|
next(1000) -> 100;
|
|
next(100) -> 10;
|
|
next(10) -> 1;
|
|
next(X) -> X div 1000.
|
|
|
|
concat(PRE, "") ->
|
|
PRE;
|
|
concat(PRE, POST) ->
|
|
PRE++" "++POST.
|
|
concat("", _, POST) ->
|
|
POST;
|
|
concat(PRE, SYM, "") ->
|
|
PRE++" "++SYM;
|
|
concat(PRE, SYM, POST) ->
|
|
PRE++" "++SYM++" "++POST.
|
|
|
|
nr2eng(0, _) ->
|
|
"";
|
|
nr2eng(NR, 1) ->
|
|
sym(NR);
|
|
nr2eng(NR, 10) when NR =< 20 ->
|
|
case sym(NR) of
|
|
"" -> strip(sym(NR-10), right, $t) ++ "teen";
|
|
_ -> sym(NR)
|
|
end;
|
|
nr2eng(NR, 10) ->
|
|
concat(
|
|
case sym((NR div 10)*10) of
|
|
"" -> strip(sym(NR div 10), right, $t) ++ "ty";
|
|
_ -> sym((NR div 10)*10)
|
|
end,
|
|
nr2eng(NR rem 10, 1));
|
|
nr2eng(NR, B) ->
|
|
PRE = nr2eng(NR div B, next(B)),
|
|
POST = nr2eng(NR rem B, next(B)),
|
|
AND = str(POST, "and"),
|
|
COMMA = if
|
|
POST == "" -> "";
|
|
AND == 0 -> " and";
|
|
B >= 1000 -> ",";
|
|
true -> ""
|
|
end,
|
|
concat(PRE, sym(B)++COMMA, POST).
|
|
|
|
start() ->
|
|
lists:foreach(
|
|
fun (X) -> io:fwrite("~p ~p ~n", [X, nr2eng(X, 1000000000)])
|
|
end,
|
|
append(seq(1, 2000), [123123, 43234234])).
|