@@ -22,37 +22,40 @@ defmodule Float do
2222
2323 """
2424 @ spec parse ( binary ) :: { float , binary } | :error
25-
26- # Integer.parse will parse "-0" as 0, so it needs to be handled separately
27- def parse ( << "-0." , rest :: binary >> ) do
28- case parse ( << ?. , rest :: binary >> , 0 ) do
25+ def parse ( "-" <> binary ) do
26+ case parse_unsign ( binary ) do
2927 :error -> :error
30- { parsed , remainder } -> { - parsed , remainder }
28+ { number , remainder } -> { - number , remainder }
3129 end
3230 end
3331
34- def parse ( binary ) when is_binary ( binary ) do
32+ def parse ( binary ) do
33+ parse_unsign ( binary )
34+ end
35+
36+ defp parse_unsign ( "-" <> binary ) , do: :error
37+ defp parse_unsign ( binary ) when is_binary ( binary ) do
3538 case Integer . parse binary do
3639 :error -> :error
37- { integer_part , after_integer } -> parse after_integer , integer_part
40+ { integer_part , after_integer } -> parse_unsign after_integer , integer_part
3841 end
3942 end
4043
4144 # Dot followed by digit is required afterwards or we are done
42- defp parse ( << ?. , char , rest :: binary >> , int ) when char in ?0 .. ?9 do
43- parse ( rest , char - ?0 , 1 , int )
45+ defp parse_unsign ( << ?. , char , rest :: binary >> , int ) when char in ?0 .. ?9 do
46+ parse_unsign ( rest , char - ?0 , 1 , int )
4447 end
4548
46- defp parse ( rest , int ) do
49+ defp parse_unsign ( rest , int ) do
4750 { :erlang . float ( int ) , rest }
4851 end
4952
5053 # Handle decimal points
51- defp parse ( << char , rest :: binary >> , float , decimal , int ) when char in ?0 .. ?9 do
52- parse rest , 10 * float + ( char - ?0 ) , decimal + 1 , int
54+ defp parse_unsign ( << char , rest :: binary >> , float , decimal , int ) when char in ?0 .. ?9 do
55+ parse_unsign rest , 10 * float + ( char - ?0 ) , decimal + 1 , int
5356 end
5457
55- defp parse ( << ?e , after_e :: binary >> , float , decimal , int ) do
58+ defp parse_unsign ( << ?e , after_e :: binary >> , float , decimal , int ) do
5659 case Integer . parse after_e do
5760 :error ->
5861 # Note we rebuild the binary here instead of breaking it apart at
@@ -65,7 +68,7 @@ defmodule Float do
6568 end
6669 end
6770
68- defp parse ( bitstring , float , decimal , int ) do
71+ defp parse_unsign ( bitstring , float , decimal , int ) do
6972 { floatify ( int , float , decimal ) , bitstring }
7073 end
7174
0 commit comments