我正在尝试读取包含以ASCII表示的整数的文本文件(例如,“2446”),并将其解析为我的Erlang / OTP程序中的整数。当我尝试解析string:to_integer/1
时,{error, no_integer}
始终返回"1"
。也许我犯了一个初学者的错误。我究竟做错了什么?这是相关代码,我尝试将Index
设置为整数:
Index = case file:read_file(Indexpath) of
{ok, Binary} ->
Index2 = case string:to_integer(io_lib:format("~s", [Binary])) of
{error, Reason} ->
io:format("to_integer error from input ~s: ~s~n", [Binary, Reason]),
0;
{Index3, _} -> Index3
end,
Index2;
{error, _} ->
Index2 = 0,
ok = file:write_file(Indexpath, io_lib:format("~B", [Index2+1])),
Index2;
_ ->
io:format("read_file case didn't match!~n", []),
-1
end,
运行时会打印到控制台的内容:to_integer error from input 1: no_integer
显然,输入是字符串“1”,所以我不明白为什么会发生这种情况。如果我做一个小测试案例,
Indexstr = "4", string:to_integer(Indexstr).
按预期返回{4,[]}。
答案 0 :(得分:2)
这是因为io_lib:format/2
返回iolist(类似于深层列表)而不是平面列表。 You can find iolist definition here。
此外,在新版本的erlang中(从R16开始),您可以使用函数`erlang:binary_to_integer / 1'来避免中间转换。
答案 1 :(得分:1)
在输入问题时找到了答案。我换了
string:to_integer(io_lib:format("~s", [Binary]))
带
string:to_integer(binary_to_list(Binary))