web-dev-qa-db-fra.com

Conversion de chaîne en int à l'aide de la fonction toInt

J'essaie de convertir une chaîne en entier à l'aide de String.toInt. Cependant, lorsque je veux lier le résultat à une variable et ensuite faire quelques calculs simples avec elle, j'obtiens cette erreur:

La fonction add s'attend à ce que le deuxième argument soit:

Int

Mais il est:

Result String Int

Comment puis-je simplement extraire la partie entière du résultat?

24
Mahdi

toInt peut échouer dans l'analyse. Vous devez le vérifier en utilisant une déclaration de cas:

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

Plus d'informations sur Result here

27
Chad Gilbert

Voici comment fournir à la conversion une valeur par défaut en cas d'échec de l'analyse.

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

Le nombre entier peut également être extrait en utilisant

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

Vous pouvez en lire plus à ce sujet ici

9
Sumit

Selon la documentation de référence Elm String , si vous extrayez un nombre à partir d'une entrée utilisateur brute, vous souhaiterez généralement utiliser Result.withDefault pour traiter les données incorrectes en cas d'échec de l'analyse. Vous pouvez chaîner cette opération en utilisant des tubes pour un code plus propre:

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

La méthode withDefault vous oblige à définir une valeur pouvant être utilisée pour des calculs, mais il n'est pas toujours possible d'établir une valeur significative pour les erreurs. Le plus souvent, vous avez besoin de toutes les valeurs possibles et la valeur par défaut n’est pas adaptée. Ici, je fournis une fonction de vérification du type de résultat que vous pouvez utiliser pour décider si vous utilisez ou non la valeur convertie:

isErrorResult r =
    case r of
        Err msg ->
            True

        Ok value ->
            False

Vous pouvez l'utiliser comme ceci:

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

la valeur default (0 dans ce cas) passée à withDefault n'a pas de sens, car nous nous sommes assurés que r n'est pas une Err.

1
Alfgaar

J'ai un peu changé les réponses des gars, car il semble être de type Peut-être

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

Utiliser la carte:

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

map2 :

Appliquez une fonction à deux résultats, si les deux sont corrects. Sinon, le le premier argument qui est un Err se propagera.

avoir le résultat add sous forme de chaîne

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

resultAsString answer

pour faciliter les choses, vous pouvez créer une fonction addStrings:

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

Vous pouvez même vous échapper avec le type 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

Essai

import Html exposing (Html, text)

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


output 3
0
Alfgaar

Vous pouvez le faire comme ci-dessous.

---- 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