@@ -22,28 +22,40 @@ defmodule Float do
2222
2323 """
2424 @ spec parse ( binary ) :: { float , binary } | :error
25- def parse ( binary ) when is_binary ( binary ) do
25+ def parse ( "-" <> binary ) do
26+ case parse_unsign ( binary ) do
27+ :error -> :error
28+ { number , remainder } -> { - number , remainder }
29+ end
30+ end
31+
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
2638 case Integer . parse binary do
2739 :error -> :error
28- { integer_part , after_integer } -> parse after_integer , integer_part
40+ { integer_part , after_integer } -> parse_unsign after_integer , integer_part
2941 end
3042 end
3143
3244 # Dot followed by digit is required afterwards or we are done
33- defp parse ( << ?. , char , rest :: binary >> , int ) when char in ?0 .. ?9 do
34- 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 )
3547 end
3648
37- defp parse ( rest , int ) do
49+ defp parse_unsign ( rest , int ) do
3850 { :erlang . float ( int ) , rest }
3951 end
4052
4153 # Handle decimal points
42- defp parse ( << char , rest :: binary >> , float , decimal , int ) when char in ?0 .. ?9 do
43- 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
4456 end
4557
46- defp parse ( << ?e , after_e :: binary >> , float , decimal , int ) do
58+ defp parse_unsign ( << ?e , after_e :: binary >> , float , decimal , int ) do
4759 case Integer . parse after_e do
4860 :error ->
4961 # Note we rebuild the binary here instead of breaking it apart at
@@ -56,7 +68,7 @@ defmodule Float do
5668 end
5769 end
5870
59- defp parse ( bitstring , float , decimal , int ) do
71+ defp parse_unsign ( bitstring , float , decimal , int ) do
6072 { floatify ( int , float , decimal ) , bitstring }
6173 end
6274
0 commit comments