@@ -164,40 +164,50 @@ defmodule Float do
164
164
end
165
165
166
166
defp parse_unsigned ( << digit , rest :: binary >> ) when digit in ?0 .. ?9 ,
167
- do: parse_unsigned ( rest , false , false , << digit >> )
167
+ do: parse_unsigned ( rest , false , false , [ digit ] )
168
168
169
169
defp parse_unsigned ( binary ) when is_binary ( binary ) , do: :error
170
170
171
171
defp parse_unsigned ( << digit , rest :: binary >> , dot? , e? , acc ) when digit in ?0 .. ?9 ,
172
- do: parse_unsigned ( rest , dot? , e? , << acc :: binary , digit >> )
172
+ do: parse_unsigned ( rest , dot? , e? , [ digit | acc ] )
173
173
174
174
defp parse_unsigned ( << ?. , digit , rest :: binary >> , false , false , acc ) when digit in ?0 .. ?9 ,
175
- do: parse_unsigned ( rest , true , false , << acc :: binary , ?. , digit >> )
175
+ do: parse_unsigned ( rest , true , false , [ digit , ?. | acc ] )
176
176
177
177
defp parse_unsigned ( << exp_marker , digit , rest :: binary >> , dot? , false , acc )
178
178
when exp_marker in ~c" eE" and digit in ?0 .. ?9 ,
179
- do: parse_unsigned ( rest , true , true , << add_dot ( acc , dot? ) :: binary , ?e , digit >> )
179
+ do: parse_unsigned ( rest , true , true , [ digit , ?e | add_dot ( acc , dot? ) ] )
180
180
181
181
defp parse_unsigned ( << exp_marker , sign , digit , rest :: binary >> , dot? , false , acc )
182
182
when exp_marker in ~c" eE" and sign in ~c" -+" and digit in ?0 .. ?9 ,
183
- do: parse_unsigned ( rest , true , true , << add_dot ( acc , dot? ) :: binary , ?e , sign , digit >> )
183
+ do: parse_unsigned ( rest , true , true , [ digit , sign , ?e | add_dot ( acc , dot? ) ] )
184
184
185
185
# When floats are expressed in scientific notation, :erlang.binary_to_float/1 can raise an
186
186
# ArgumentError if the e exponent is too big. For example, "1.0e400". Because of this, we
187
187
# rescue the ArgumentError here and return an error.
188
188
defp parse_unsigned ( rest , dot? , true = _e? , acc ) do
189
- :erlang . binary_to_float ( add_dot ( acc , dot? ) )
189
+ acc
190
+ |> add_dot ( dot? )
191
+ |> :lists . reverse ( )
192
+ |> :erlang . list_to_float ( )
190
193
rescue
191
194
ArgumentError -> :error
192
195
else
193
196
float -> { float , rest }
194
197
end
195
198
196
- defp parse_unsigned ( rest , dot? , false = _e? , acc ) ,
197
- do: { :erlang . binary_to_float ( add_dot ( acc , dot? ) ) , rest }
199
+ defp parse_unsigned ( rest , dot? , false = _e? , acc ) do
200
+ float =
201
+ acc
202
+ |> add_dot ( dot? )
203
+ |> :lists . reverse ( )
204
+ |> :erlang . list_to_float ( )
205
+
206
+ { float , rest }
207
+ end
198
208
199
209
defp add_dot ( acc , true ) , do: acc
200
- defp add_dot ( acc , false ) , do: acc <> ".0"
210
+ defp add_dot ( acc , false ) , do: [ ?0 , ?. | acc ]
201
211
202
212
@ doc """
203
213
Rounds a float to the largest float less than or equal to `number`.
0 commit comments