【问题标题】:String to int conversion using toInt function使用 toInt 函数将字符串转换为 int
【发布时间】:2015-12-18 19:33:01
【问题描述】:

我正在尝试使用 String.toInt 将字符串转换为整数。但是,当我想将结果绑定到一个变量,然后用它做一些简单的数学运算时,我得到了这个错误:

函数add 期望第二个参数是:

Int

但它是:

Result String Int

我怎样才能只提取结果的整数部分?

【问题讨论】:

    标签: elm


    【解决方案1】:

    以下是在解析失败的情况下如何为转换提供默认值。

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

    【讨论】:

    • 此行为是否已更改?对我来说,这段代码改为'String.toInt newContent |> Maybe.withDefault 0'。我正在使用 elm-version 0.19.0,但我不明白为什么我得到的是可能返回而不是结果
    【解决方案2】:

    toInt 可能无法解析。您需要使用 case 语句检查它:

    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

    【讨论】:

    • 对于 Elm 0.19 toInt 返回 Maybe Int 而不是 Result,所以这个答案不再正确。
    【解决方案3】:

    整数也可以使用

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

    您可以阅读更多关于它的信息here

    【讨论】:

      【解决方案4】:

      根据Elm String reference documentation,如果您要从一些原始用户输入中提取数字,您通常希望使用Result.withDefault 来处理错误数据以防解析失败。您可以使用管道链接此操作以获得更简洁的代码:

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

      【讨论】:

        【解决方案5】:
        Maybe.withDefault 0 (String.toInt "42")
        

        【讨论】:

          【解决方案6】:

          使用地图:

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

          map2:

          如果两个结果都OK,则对两个结果应用一个函数。如果没有,则 第一个参数是 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
          

          【讨论】:

            【解决方案7】:

            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
            

            传递给withDefaultdefault 值(在本例中为0)是没有意义的,因为我们确保r 不是Err

            【讨论】:

              【解决方案8】:

              您可以按以下方式执行此操作。

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

              【讨论】:

                【解决方案9】:

                我已经改变了一些人的答案,因为它似乎是 Maybe 类型的

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-09-26
                  • 2014-06-27
                  • 2017-08-09
                  相关资源
                  最近更新 更多