Skip to content

Commit 8c6e31b

Browse files
committed
Pattern match just on "-"
1 parent 70d7a28 commit 8c6e31b

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

lib/elixir/lib/float.ex

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)