Erlang字符串:to_integer / 1无法解析有效字符串

时间:2014-10-16 03:58:56

标签: erlang otp

我正在尝试读取包含以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,[]}。

2 个答案:

答案 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))