Skip to content

Instantly share code, notes, and snippets.

@aialferov
Created October 8, 2014 13:41
Show Gist options
  • Select an option

  • Save aialferov/852ecbeb732fe2dd02ea to your computer and use it in GitHub Desktop.

Select an option

Save aialferov/852ecbeb732fe2dd02ea to your computer and use it in GitHub Desktop.
Converts number to its text representation.
-module(number_to_text).
-export([convert/1]).
-define(Part(N), case N of
2 -> "thousand";
3 -> "million";
4 -> "billion";
5 -> "trillion"
end).
convert("0") -> "zero";
convert([D1|[]]) -> digit([D1]);
convert([D2|[D1|[]]]) -> decade([D2|[D1]]);
convert([D3|[D2|[D1|[]]]]) -> result(hundred([D3]), decade([D2|[D1]]));
convert(Number) -> parts_to_text(split_to_parts(Number)).
split_to_parts(Number) ->
lists:reverse(split_to_parts(lists:reverse(Number), [], 0)).
split_to_parts(L, Acc, 3) -> [Acc] ++ split_to_parts(L, [], 0);
split_to_parts([H|T], Acc, N) -> split_to_parts(T, [H|Acc], N + 1);
split_to_parts([], [], _) -> [];
split_to_parts([], Acc, _) -> [Acc].
parts_to_text(Number) -> lists:foldl(fun
(Part, {1, Result}) -> result(Result, convert(Part));
(Part, {N, Result}) -> {N - 1, result(Result, number(N, Part))}
end, {length(Number), ""}, Number).
digit("0") -> "";
digit("1") -> "one";
digit("2") -> "two";
digit("3") -> "three";
digit("4") -> "four";
digit("5") -> "five";
digit("6") -> "six";
digit("7") -> "seven";
digit("8") -> "eight";
digit("9") -> "nine".
decade("0" ++ Digit) -> digit(Digit);
decade("10") -> "ten";
decade("11") -> "eleven";
decade("12") -> "twelve";
decade("13") -> "thirteen";
decade("14") -> "fourteen";
decade("15") -> "fifteen";
decade("16") -> "sixteen";
decade("17") -> "seventeen";
decade("18") -> "eighteen";
decade("19") -> "nineteen";
decade([D|Digit]) -> case [D] of
"2" -> "twenty";
"3" -> "thirty";
"4" -> "forty";
"5" -> "fifty";
"6" -> "sixty";
"7" -> "seventy";
"8" -> "eighty";
"9" -> "ninety"
end ++ d(Digit) ++ digit(Digit).
hundred("0") -> "";
hundred(Number) -> digit(Number) ++ " hundred".
number(_, "000") -> "";
number(N, Number) -> convert(Number) ++ " " ++ ?Part(N).
result(Current, NewPart) when NewPart == "" -> Current;
result(Current, NewPart) when Current == "" -> NewPart;
result(Current, NewPart) -> Current ++ " " ++ NewPart.
d("0") -> "";
d(_) -> "-".
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment