【发布时间】:2020-01-16 07:45:03
【问题描述】:
我正在使用 Erlang 开发一个应用程序,该应用程序必须处理几种不同货币的数字格式。有许多复杂性需要考虑,比如货币符号、它的去向(右或左)等。但是这种格式的一个方面在其他编程语言中使用起来很简单,但在 Erlang 中很难,这是用于千位和小数位的分隔符。
对于大多数英语国家(与货币无关),预期的数字格式为:
9,999,999.99
对于其他几个国家,例如德国和巴西,数字格式不同:
9.999.999,99
还有其他变体,例如法语变体,带有空格:
9 999 999,99
问题是我找不到从浮点数开始的好方法来实现这些格式。当然io_lib:format/2 可以将其转换为字符串,但它似乎不提供对用作小数分隔符的符号的任何控制,并且不输出任何千位分隔符(这使得“搜索和替换”成为一种解决方法"不可能)。
这是我们迄今为止的一个例子:
%% currency_l10n.erl
-module(currency_l10n).
-export([format/2]).
number_format(us, Value) ->
io_lib:format("~.2f", [Value]);
number_format(de, Value) ->
io_lib:format("~B,~2..0B", [trunc(Value), trunc(Value*100) rem 100]).
%% Examples on the Erlang REPL:
1> currency_l10n:number_format(us, 9999.99).
"9999.99"
2> currency_l10n:number_format(de, 9999.99).
"9999,99"
如您所见,小数点分隔符的解决方法已经不是很漂亮,处理数千个分隔符也不会更好。我们这里有什么遗漏吗?
【问题讨论】:
标签: localization formatting erlang currency number-formatting