0

我有一个值列表“Z0010”、“Z0011”、“Z0012”、“Z0013”“Z0014”、“Z0015”、“Z0016”、“Z0017”、“Z0018”、“Z0019”

我想开发一个在参数中取值的函数

如果作为参数传递的值等于列表中的值,我想在我的函数中进行测试,在这种情况下,它会显示“存在”,否则会显示“不存在”

我尝试:

test(Token)->
case get_user_formid_by_token(Token) of
                {ok, H} ->
                     FormId=string:substr(H, 2, length(H)),
                    Form=string:to_integer(FormId), 
                      case verify (0019,1,Form) of
                    {ok}->io:format("existe");
                    {notok}->io:format("not existe") 
                      end;

                {error, notfound}-> io:format("qq")

end.


verify(VariableLength,VariableIncrement,FormId)->


         lists:map(fun(I) -> if I =:= FormId ->
                             {ok};  
                             I =/= FormId ->
                          {notok}
                            end



                   end,
          lists:seq(0010, VariableLength, VariableIncrement)).

但是当我执行此代码时,它显示:

1> model:test("21137900").
** exception error: no case clause matching [{notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok},
                                             {notok}]
     in function  model:test/1

我现在尝试使用此解决方案:

get_user_formid_by_token(Token) ->
    Q = qlc:q([{X#person.formid} || X <- mnesia:table(person),
                X#person.token =:= Token]),
    case do(Q) of
        [{H}] ->
            {ok, H};
        [] ->
            {error, notfound}
    end.



    test(Token)->
    case get_user_formid_by_token(Token) of
                    {ok, H} ->
                        io:format("~s~n",[H]),
                         FormId=string:substr(H, 5, length(H)),
    io:format("~s~n",[FormId]),
                        Form=string:to_integer(FormId), 
                         io:format("~p~n",[Form]),
                         lists:member(Form, lists:seq(313, 320, 1));
                    {error, notfound}-> io:format("qq")

    end.

但是当我测试时,我在控制台中有这条消息:

1> model:test("21137900").
Z000313
313
{313,[]}
false

结果应该是真的而不是假的

我认为Form=string:to_integer(FormId),在这种情况下它不会返回 313

还有一件事我想在我的代码中添加

例如如果H等于"Z000010" FormId=string:substr(H, 2, length(H)),

它返回 “000010” 现在我想消除第一个整数之前的第一个零不为空,所以在 1 之前提取 0000

4

2 回答 2

1

lists:map/2获取一个列表并创建一个具有相同数量值的新列表,因此您的 10 个值列表将转换为 10 个{ok}{notok}元组的列表。

你可能想要lists:member/2

5> lists:member(0, lists:seq(1, 3, 1)).               
false
6> lists:member(3, lists:seq(1, 3, 1)).
true
7> lists:map(fun(X) -> ok end, lists:seq(1, 3, 1)).
[ok,ok,ok]
于 2013-02-11T14:25:52.867 回答
0

查看文档(http://www.erlang.org/doc/man/string.html#to_integer-1):

to_integer(String) -> {Int, Rest} | {error, Reason}

Types:
String = string()
Int = integer()
Rest = string()
Reason = no_integer | not_a_list

所以to_integer返回一个元组,其中包含从字符串中消耗的数字和字符串的其余部分。你甚至可以从你的测试输出中看出它在哪里{313,[]}。为了获得绑定到Form变量的数字的值,您需要分解元组,这通常通过模式匹配来完成:

{Form,_Rest}=string:to_integer(FormId)

现在您的Form遗嘱中只包含数字313

string:to_integer函数还将愉快地吃掉前导零:

1> {Form, _} = string:to_integer("000010"), Form.
10
于 2013-02-11T20:55:43.367 回答