【问题标题】:How to convert a binary string to an integer or a float?如何将二进制字符串转换为整数或浮点数?
【发布时间】:2011-05-18 17:47:55
【问题描述】:

我有两种形式的二进制字符串:

<<"5.7778345">>

<<"444555">>

我事先不知道它是浮点数还是整数。

我尝试检查它是否为整数。这不起作用,因为它是二进制的。我还尝试将二进制转换为列表,然后检查是 int 还是 float。我没有成功。

它需要是一个函数,例如:

binToNumber(Bin) ->
  %% Find if int or float
  Return.

有人知道怎么做吗?

【问题讨论】:

    标签: string erlang floating-point integer


    【解决方案1】:

    没有快速的方法来做到这一点。改用这样的东西:

    bin_to_num(Bin) ->
        N = binary_to_list(Bin),
        case string:to_float(N) of
            {error,no_float} -> list_to_integer(N);
            {F,_Rest} -> F
        end.
    

    这应该将二进制转换为列表(字符串),然后尝试将其放入浮点数中。当这不能完成时,我们返回一个整数。否则,我们保留浮动并返回它。

    【讨论】:

    • 你可能想要 list_to_float 而不是 string:to_float。
    • 这也是一种有效的方法是的。可能更快。 string:to_float 会容忍更多的垃圾,这可能是也可能不是优势。我赞成你的回答。
    • 我主要建议它,因为 > 将被认为是有效的,但不是 >。故意的垃圾容忍版本也可以处理整数大小写。
    【解决方案2】:

    binary_to_term 函数及其对应的 term_to_binary 可能会很好地为您服务。

    【讨论】:

    • 在这种情况下不是。使用binary_to_termterm_to_binary 转换最多会将二进制字符串更改为常规列表/字符串。不会获得浮点数或整数。请参阅我的回复以了解如何做到这一点。
    • @I GIVE TERRIBLE AdvICE:我建议首先使用term_to_binary 来获取二进制文件。然后转换回来是微不足道的。当然,如果 OP 无法控制数据的来源,这仍然是完全不现实的。
    • 这是有道理的,在这种情况下。
    【解决方案3】:

    这是我们使用的模式:

    binary_to_number(B) ->
        list_to_number(binary_to_list(B)).
    
    list_to_number(L) ->
        try list_to_float(L)
        catch
            error:badarg ->
                list_to_integer(L)
        end.
    

    【讨论】:

      【解决方案4】:

      由于 Erlang/OTP R16B,无需中间转换为列表:

      -spec binary_to_number(binary()) -> float() | integer().
      binary_to_number(B) ->
          try binary_to_float(B)
          catch
              error:badarg -> binary_to_integer(B)
          end.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-29
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        • 1970-01-01
        相关资源
        最近更新 更多