Skip to content

Commit ab9379e

Browse files
committed
Add to_float_or/2
1 parent eb8003d commit ab9379e

File tree

2 files changed

+60
-7
lines changed

2 files changed

+60
-7
lines changed

lib/transformer.ex

Lines changed: 59 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ defmodule Transformer do
2121
iex> Transformer.to_integer_or("a", nil)
2222
nil
2323
24-
iex> Transformer.to_integer_or("a", & &1 <> &1)
25-
"aa"
24+
iex> Transformer.to_integer_or("a", &{:error, &1})
25+
{:error, "a"}
2626
2727
"""
28-
@spec to_integer_or(integer() | String.t() | nil, any()) :: integer() | any()
28+
@spec to_integer_or(any(), any()) :: integer() | any()
2929
def to_integer_or(value, substitute \\ & &1)
3030

3131
def to_integer_or(value, _substitute) when is_integer(value) do
@@ -73,10 +73,10 @@ defmodule Transformer do
7373
iex> Transformer.to_integer_list_or([1, 2])
7474
[1, 2]
7575
76-
iex> Transformer.to_integer_list_or(["a", 2], nil)
77-
[nil, 2]
76+
iex> Transformer.to_integer_list_or(["a", 2], &{:error, &1})
77+
[{:error, "a"}, 2]
7878
"""
79-
@spec to_integer_list_or(String.t() | list(), any(), String.t()) :: list()
79+
@spec to_integer_list_or(any(), any(), String.t()) :: list()
8080
def to_integer_list_or(value, substitute \\ & &1, split_pattern \\ ",")
8181

8282
def to_integer_list_or(value, substitute, split_pattern) when is_binary(value) do
@@ -88,4 +88,57 @@ defmodule Transformer do
8888
def to_integer_list_or(value, substitute, _) when is_list(value) do
8989
value |> Enum.map(&to_integer_or(&1, substitute))
9090
end
91+
92+
@doc """
93+
Convert to float without error.
94+
If it cannot be converted, it returns a substitute.
95+
96+
## Examples
97+
98+
iex> Transformer.to_float_or(1)
99+
1.0
100+
101+
iex> Transformer.to_float_or(1.2)
102+
1.2
103+
104+
iex> Transformer.to_float_or("2")
105+
2.0
106+
107+
iex> Transformer.to_float_or("a")
108+
"a"
109+
110+
iex> Transformer.to_float_or("a", nil)
111+
nil
112+
113+
iex> Transformer.to_float_or("a", &{:error, &1})
114+
{:error, "a"}
115+
116+
"""
117+
@spec to_float_or(any(), any()) :: float() | any()
118+
def to_float_or(value, substitute \\ & &1)
119+
120+
def to_float_or(value, _substitute) when is_float(value) do
121+
value
122+
end
123+
124+
def to_float_or(value, _substitute) when is_integer(value) do
125+
value * 1.0
126+
end
127+
128+
def to_float_or(value, substitute) when is_binary(value) do
129+
try do
130+
String.to_float(value)
131+
rescue
132+
_ ->
133+
try do
134+
String.to_integer(value) * 1.0
135+
rescue
136+
_ -> to_substitute(value, substitute)
137+
end
138+
end
139+
end
140+
141+
def to_float_or(value, substitute) do
142+
to_substitute(value, substitute)
143+
end
91144
end

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
defmodule Transformer.MixProject do
22
use Mix.Project
33

4-
@version "0.0.1"
4+
@version "0.0.2"
55
@source_url "https://github.com/ByeongUkChoi/transformer"
66

77
def project do

0 commit comments

Comments
 (0)