Локализация валюты в эрланге?
У меня есть сумма, как 10 цифр "1234567328.899"
Я хочу показать как валюту с запятыми в нем, как это:
"$1,234,567,328.899".
Я написал отдельный модуль для этого, он работал
partition_float(N,P,FP,L) ->
F = tl(tl(hd(io_lib:format("~.*f",[L,N-trunc(N)])))),
lists:flatten([partition_integer(trunc(N),P),FP,F]).
partition_float(Data, $,, $., 6).%% Where Data is ["1234567328.899", ""1217328.89", "67328", ...]
Он успешно работал как отдельный, но при вставке в проект chicagoboss выдает следующую ошибку.
[{"c:/Users/Dey/InheritanceTax/inheritance_tax/src/lib/data_util.erl",[{575,erl_lint,{call_to_redefined_old_bif,{trunc,1}}},{576,erl_lint,{call_to_redefined_old_bif,{trunc,1}}}]}]
2 ответа
Решение
-module(amt).
-export([main/0]).
format(S, Acc, M) ->
try
Str = string:substr(S, 1, 3),
Str1 = Str ++ ",",
Str2 = string:substr(S, 4),
format(Str2, Acc ++ Str1, M),
ok
catch
error:_Reason ->
% io:format("~p~n", [Reason]),
io:format("~p", [lists:reverse(Acc ++ S ++ "$") ++ "." ++ M])
end.
disp(N) ->
[L,M] = string:tokens(N, "."),
format(lists:reverse(L), "", M).
main() -> disp("1234567328.899"). % "$1,234,567,328.899"ok
Там есть небольшая ошибка для цифр ровно шести символов. Ниже приведен небольшой твик. Если я получу возможность, я опубликую окончательное обновление с более общей формой этого метода, которая может принимать числовые, строковые или двоичные данные и определять, нужно ли сохранять десятичное место и сколько мест.
-module(format).
-export([currency/1]).
format_decimal_number(S, Acc, M) ->
try
Str = string:substr(S, 1, 3),
Str2 = string:substr(S, 4),
Str1 = if
length(Str2) > 0 -> Str ++ ",";
true -> Str
end,
format_decimal_number(Str2, Acc ++ Str1, M)
catch
error:_Reason ->
io_lib:format("~s", [lists:reverse(Acc ++ S ++ "$") ++ "." ++ M])
end.
format_integer_number(S, Acc) ->
try
Str = string:substr(S, 1, 3),
Str2 = string:substr(S, 4),
Str1 = if
length(Str2) > 0 -> Str ++ ",";
true -> Str
end,
format_integer_number(Str2, Acc ++ Str1)
catch
error:_Reason ->
io_lib:format("~s", [lists:reverse(Acc ++ S ++ "$") ])
end.
currency(N) ->
format_integer_number(lists:reverse(N), "").
currency_decimal(N) ->
[L,M] = string:tokens(N, "."),
format_decimal_number(lists:reverse(L), "", "").