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

そして、コードに追加したいもう 1 つのこと

たとえば、Hが"Z000010"に等しい場合FormId=string:substr(H, 2, length(H)),

それは「000010」を返し ます今、最初の整数の前の最初のゼロを削除したいので、1の前に0000を抽出します

4

2 に答える 2

1

lists:map/21 つのリストを取り、同じ数の値を持つ新しいリストを作成するため、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 に答える