2015-12-18 5 views
18

Ich versuche, eine Zeichenfolge mit String.toInt Integer zu konvertieren. Allerdings, wenn ich das Ergebnis in eine Variable binden möchten, und dann tun einige einfache mathematische damit bekomme ich diesen Fehler:String zu Int-Konvertierung mit ToInt-Funktion

Function add is expecting the 2nd argument to be:

Int 

But it is:

Result String Int 

Wie kann ich nur den ganzzahligen Teil des Ergebnisses extrahieren?

Antwort

21

toInt kann beim Parsen fehlschlagen. Sie müssen es überprüfen Fall Anweisung:

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

More about Result here

25

Hier ist, wie die Konvertierung mit einem Standardwert zu liefern, falls die Analyse fehlschlägt.

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

Die ganze Zahl auch

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

Sie mehr lesen können mit herausgezogen werden kann darüber here

1

die Elm String reference documentation Laut, wenn Sie eine Reihe von einiger rohen Benutzereingabe extrahieren, Normalerweise möchten Sie Result.withDefault verwenden, um fehlerhafte Daten zu verarbeiten, falls die Analyse fehlschlägt. Sie können diesen Vorgang Kettenleitungen für sauberere Code:

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

Verwenden Karte:

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

map2:

Apply a function to two results, if both results are Ok. If not, the first argument which is an Err will propagate through.

das add Ergebnis als String haben

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

resultAsString answer 

Dinge einfacher machen Sie eine addStrings Funktion erstellen:

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

Sie können sogar mit dem Result Typ ganz weg:

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 

Testing

import Html exposing (Html, text) 

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


output 3 
0

Die withDefault Methode zwingt Sie um einen Wert zu definieren, der für Berechnungen verwendet werden kann, aber es ist nicht immer möglich, einen Wert zu erstellen, der für Fehler signifikant ist. Meistens benötigen Sie alle möglichen Werte, und Standard ist nicht geeignet. Hier biete ich einen Ergebnistyp Prüffunktion können Sie verwenden, um zu entscheiden, ob Sie verwenden oder nicht den umgerechneten Wert:

isErrorResult r = 
    case r of 
     Err msg -> 
      True 

     Ok value -> 
      False 

Sie können es wie folgt verwenden:

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 

der default Wert (0 in diesem Fall) an withDefault übergeben ist bedeutungslos, weil wir dafür gesorgt haben, dass r kein Err ist.