Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions lib/elixir/lib/string.ex
Original file line number Diff line number Diff line change
Expand Up @@ -670,4 +670,64 @@ defmodule String do
_ -> acc
end
end

@doc """
Converts a string to an integer. If successful, returns a
tuple of form {integer, remainder of string}. If unsuccessful,
returns :error.

## Examples

iex> String.to_integer("34")
{34,""}
iex> String.to_integer("34.5")
{34,".5"}
iex> String.to_integer("three")
:error

"""
@spec to_integer(t) :: {integer, t} | :error

def to_integer(string) do
{result, remainder} = :string.to_integer(binary_to_list(string))
case result do
:error -> :error
_ -> {result, list_to_binary(remainder)}
end
end

@doc """
Converts a string to a float. If successful, returns a
tuple of form {float, remainder of string}. If unsuccessful,
returns :error. If given an integer value, will return
same as to_integer/1.

## Examples

iex> String.to_float("34")
{34.0,""}
iex> String.to_float("34.25")
{34.25,""}
iex> String.to_float("56.5xyz")
{56.5,"xyz"}
iex> String.to_float("pi")
:error

"""
@spec to_float(t) :: {integer, t} | :error

def to_float(string) do
charlist = binary_to_list(string)
{result, remainder} = :string.to_float(charlist)
case result do
:error ->
{int_result, int_remainder} = :string.to_integer(charlist)
case int_result do
:error -> :error
_ -> {float(int_result), list_to_binary(int_remainder)}
end
_ -> {result, list_to_binary(remainder)}
end
end

end
26 changes: 26 additions & 0 deletions lib/elixir/test/elixir/string_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -237,4 +237,30 @@ defmodule StringTest do
refute String.valid_codepoint?("ab")
end

test :to_integer do
assert String.to_integer("12") == {12,""}
assert String.to_integer("-12") == {-12,""}
assert String.to_integer("123456789") == {123456789,""}
assert String.to_integer("12.5") == {12,".5"}
assert String.to_integer("7.5e-3") == {7,".5e-3"}
assert String.to_integer("12x") == {12,"x"}
assert String.to_integer("three") == :error
end

test :to_float do
assert String.to_float("12") == {12.0,""}
assert String.to_float("-12") == {-12.0,""}
{value, _remdr} = String.to_float("12");
refute value === 12
assert String.to_float("123456789") == {123456789.0,""}
assert String.to_float("12.5") == {12.5,""}
assert String.to_float("-12.5") == {-12.5,""}
assert String.to_float("7.5e3") == {7.5e3,""}
assert String.to_float("7.5e-3") == {7.5e-3,""}
assert String.to_float("12x") == {12.0,"x"}
assert String.to_float("12.5x") == {12.5,"x"}
assert String.to_float("pi") == :error
end


end