erlang服务端做多语言推送时往往会遇到这种情况。比如提示“您获得了XX个金币", XX是个变量,如果把这句话拆分成两句话再拼接,实在优点傻,像这样:
%% encoding: utf-8
-define(TEXT1, "您获得了").
-define(TEXT2, "个金币").
...
Message = ?TEXT1 ++ "50" ++ ?TEXT2.
还有一种稍微不傻的解决方法是吧XX都用某个特殊字符组代替,写一个替换函数每次替换。
今天写了了一个更优雅的解决方式:
%% encoding: utf-8
-define(TEXT1, "您获得了~p个金币").
-define(TEXT2, "您获得了~s个金币").
Message1 = lists:flatten(io_lib:format(?TEXT1, [50])),
Message2 = lists:flatten(io_lib:format(?TEXT2, ["50"])),
io:format("~ts~n~ts~n", [Message1, Message2]).
Output:
您获得了50个金币
您获得了50个金币
> io_lib:format("Get ~s coins", ["50"]).
> [71,101,116,32,"50",32,99,111,105,110,115]
> io:format("~w", ["50"]).
> [53, 48]
这里把用"50",也就是[53, 48]替换了~s.
> io:format("~w~n", [lists:flatten([71,101,116,32,"50",32,99,111,105,110,115])]).
> [71,101,116,32,53,48,32,99,111,105,110,115]
lists:flatten/1 就是把一个lists里面的DeepList展开。
> lists:flatten([1,[2,[3]]]).
> [1,2,3]
可以看到多重嵌套也被展开。
如果要得到binary数据可以使用:
unicode:characters_to_binary("我稀饭你").
完~