Packages
ex_cldr_numbers
2.27.1
2.38.3
2.38.2
2.38.1
2.38.0
2.37.0
2.36.0
2.35.2
2.35.1
2.35.0
2.34.1
2.34.0
2.33.6
2.33.5
2.33.4
2.33.3
2.33.2
2.33.1
2.33.0
2.32.4
2.32.3
2.32.2
2.32.1
2.32.0
retired
2.31.3
retired
2.31.2
2.31.1
2.31.0
2.30.1
2.30.0
2.29.0
2.28.0
2.27.3
2.27.2
2.27.1
2.27.0
2.26.0
2.25.2
2.25.1
2.25.0
2.24.0
2.23.3
2.23.2
2.23.1
2.23.0
2.23.0-rc.4
2.23.0-rc.3
2.23.0-rc.2
2.23.0-rc.1
2.23.0-rc.0
2.22.1
2.22.0
2.21.0
2.20.0
2.19.0
2.18.4
2.18.3
2.18.2
2.18.1
2.18.0
2.17.0
2.17.0-rc.1
2.17.0-rc.0
2.16.1
2.16.0
2.16.0-rc.0
2.15.4
2.15.3
2.15.2
2.15.1
2.15.0
2.14.0
2.13.2
2.13.1
2.13.0
2.13.0-rc.0
2.12.1
2.12.0
2.11.0
2.10.0
2.9.0
2.8.0
2.7.2
2.7.1
2.7.0
2.6.4
2.6.3
2.6.2
2.6.1
2.6.0
2.5.0
2.4.4
2.4.3
2.4.2
2.4.1
2.4.0
2.3.0
2.2.0
2.1.1
2.1.0
2.0.0
2.0.0-rc.0
1.6.0
1.5.2
1.5.1
1.5.0
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.1
1.3.0
1.3.0-rc.1
1.3.0-rc.0
retired
1.2.0
1.1.0
1.0.1
1.0.0
1.0.0-rc.0
retired
0.3.3
0.3.2
retired
0.3.1
retired
0.3.0
retired
0.2.3
0.2.2
0.2.1
0.2.0
0.1.0
Number and currency localization and formatting functions for the Common Locale Data Repository (CLDR).
Current section
Files
Jump to
Current section
Files
src/decimal_formats_parser.yrl
% Parse CLDR decimal formats which are described at
% http://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns
Nonterminals decimal_format positive_format negative_format number_format
prefix suffix literal_list literal_elem currency_symbol.
Terminals plus minus format currency_1 currency_2 currency_3 currency_4 percent
permille literal semicolon pad quote quoted_char.
Rootsymbol decimal_format.
decimal_format -> positive_format semicolon negative_format : [{positive, '$1'}, {negative, '$3'}].
decimal_format -> positive_format : [{positive, '$1'}, negative('$1')].
positive_format -> prefix number_format suffix : '$1' ++ format('$2') ++ '$3'.
positive_format -> prefix number_format : '$1' ++ format('$2').
positive_format -> number_format suffix : format('$1') ++ '$2'.
positive_format -> number_format : format('$1').
positive_format -> prefix : '$1'.
negative_format -> prefix number_format suffix : '$1' ++ neg_format('$2') ++ '$3'.
negative_format -> prefix number_format : '$1' ++ neg_format('$2').
negative_format -> number_format suffix : neg_format('$1') ++ '$2'.
negative_format -> number_format : neg_format('$1').
number_format -> format : unwrap('$1').
prefix -> literal_list pad : '$1' ++ pad('$2').
prefix -> pad literal_list : pad('$1') ++ '$2'.
prefix -> literal_list : '$1'.
prefix -> pad : pad('$1').
suffix -> prefix : '$1'.
literal_list -> literal_elem literal_list : append('$1', '$2').
literal_list -> literal_elem : '$1'.
literal_elem -> currency_symbol : [{currency, unwrap('$1')}].
literal_elem -> percent : [{percent, unwrap('$1')}].
literal_elem -> permille : [{permille, unwrap('$1')}].
literal_elem -> literal : [{literal, unwrap('$1')}].
literal_elem -> plus : [{plus, "+"}].
literal_elem -> minus : [{minus, "-"}].
literal_elem -> quote : [{quote, '\''}].
literal_elem -> quoted_char : [{quoted_char, unwrap('$1')}].
currency_symbol -> currency_1 : '$1'.
currency_symbol -> currency_2 : '$1'.
currency_symbol -> currency_3 : '$1'.
currency_symbol -> currency_4 : '$1'.
Erlang code.
% If there is no negative pattern then build the default one. The default
% is an exact copy of the positive one except we put `{minus, "-"}`
% in front of the `format` token.
negative(Positive) ->
{negative, copy_positive(Positive)}.
copy_positive([]) -> [];
copy_positive([{format, Format} | Rest]) -> [{minus, "-"}, {format, Format} | copy_positive(Rest)];
copy_positive([Head | Rest]) -> [Head | copy_positive(Rest)].
% Append list items. Consolidate literals if possible into
% a single list element.
append([{literal, Literal1}], [{literal, Literal2} | Rest]) ->
[{literal, list_to_binary([Literal1, Literal2])}] ++ Rest;
append(A, B) when is_list(A) and is_list(B) ->
A ++ B.
format(F) ->
[{format, F}].
% Doesn't matter what the negative format is
% its always the same as the positive one
% with potentially different suffix and prefix
neg_format(_F) ->
[{format, same_as_positive}].
pad(V) ->
[{pad, unwrap(V)}].
% Return a token value
unwrap({_,_,V}) when is_list(V) -> unicode:characters_to_binary(V);
unwrap({_,_,V}) -> V.