web-dev-qa-db-ja.com

toInt関数を使用した文字列から整数への変換

String.toIntを使用して文字列を整数に変換しようとしています。ただし、結果を変数にバインドし、それを使用して簡単な計算を行うと、次のエラーが発生します。

関数addは、2番目の引数が次のようになることを期待しています:

Int

しかしそれは:

Result String Int

結果の整数部分を抽出するにはどうすればよいですか?

24
Mahdi

toIntは解析に失敗する可能性があります。あなたはcase文を使ってそれをチェックする必要があります:

case toInt str of
  Err msg -> ... -- do something with the error message
  Ok val -> ... -- val is an Int which you can add

結果の詳細はこちら

27
Chad Gilbert

解析が失敗した場合に、変換にデフォルト値を提供する方法は次のとおりです。

String.toInt "5" |> Result.toMaybe |> Maybe.withDefault 0
32
d13

整数はまた、

Result.withDefault 0 (String.toInt "2")

あなたはそれについてもっと読むことができます ここ

9
Sumit

Elm String reference documentation によると、生のユーザー入力から数値を抽出する場合、通常、Result.withDefaultを使用して、解析が失敗した場合に不良データを処理する必要があります。よりクリーンなコードのためにパイプを使用してこの操作を連鎖させることができます:

String.toInt "5" |> Result.withDefault 0
3
akdev

withDefaultメソッドを使用すると、計算に使用できる値を定義する必要がありますが、エラーにとって重要な値を常に設定できるとは限りません。ほとんどの場合、すべての可能な値が必要であり、デフォルトは適合しません。ここでは、変換された値を使用するかどうかを決定するために使用できる結果タイプチェック関数を提供します。

isErrorResult r =
    case r of
        Err msg ->
            True

        Ok value ->
            False

次のように使用できます。

r = String.toInt "20b"

if isErrorResult r then
    -- not a valid Interger, abort or whatever
else
    -- a good integer, extract it
    a = Result.withDefault 0 r
    -- and make good use of it

defaultwithDefaultではないことを確認したため、rに渡されたErr値(この場合は0)は意味がありません。

1
Alfgaar

たぶんタイプを変更したようです。

isErrorResult : String -> Bool
isErrorResult r =
case String.toInt r of
    Nothing -> True
    Just value -> False

マップを使用:

answer = Result.map2 (+) (String.toInt "1") (String.toInt "2")

map2

2つの結果がOKの場合、2つの結果に関数を適用します。そうでない場合は、Errである最初の引数が伝搬されます。

add結果を文字列として取得するには

resultAsString r =
    case r of
        Err msg -> msg
        Ok value -> toString value

resultAsString answer

物事を簡単にするために、addStrings関数を作成できます。

addStrings : String -> String -> Result String Int
addStrings a b =
    Result.map2 (+) (String.toInt a) (String.toInt b)

Resultタイプを完全に回避することもできます。

addStrings : String -> String -> String
addStrings a b =
    let
        r =
            Result.map2 (+) (String.toInt a) (String.toInt b)
    in
    case r of
        Err msg ->
            msg

        Ok value ->
            toString value

テスト中

import Html exposing (Html, text)

main : Html msg
main =
    text (addStrings "1" "2")


output 3
0
Alfgaar

以下のようにしてこれを行うことができます。

---- Elm 0.19.0 ----------------------------------------------------------------
Read <https://Elm-lang.org/0.19.0/repl> to learn more: exit, help, imports, etc.
--------------------------------------------------------------------------------
> parseInt string = String.toInt string
<function> : String -> Maybe Int
> resultParseInt string = \
|   Result.fromMaybe ("error parsing string: " ++ string) (parseInt string)
<function> : String -> Result String Int
> resultParseInt "12"
Ok 12 : Result String Int
> resultParseInt "12ll"
Err ("error parsing string: 12ll") : Result String Int
>
0
Arup Rakshit
Maybe.withDefault 0 (String.toInt "42")
0
Denis