@@ -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
91144end
0 commit comments