जवाबों:
जाँच करें Integer.parse/1
और Float.parse/1
।
Integer.parse/1
से अधिक String.to_integer/1
?
Integer.parse/1
एक :error
परमाणु लौटाता है । String.to_integer/1
फेंकता है (FunctionClauseError)
।
जोस ने सुझाव दिया है कि कार्यों Integer.parse/1
और Float.parse/1
कार्यों के अलावा आप भी जाँच कर सकते हैं String.to_integer/1
और String.to_float/1
।
संकेत: यह भी देखें to_atom/1
, to_char_list/1
, to_existing_atom/1
अन्य रूपांतरण के लिए।
इस पृष्ठ पर लोगों को धन्यवाद, बस यहाँ एक जवाब को सरल बनाने:
{intVal, ""} = Integer.parse(val)
जैसा कि यह पुष्टि करता है कि पूरे स्ट्रिंग को पार्स किया गया था (न कि सिर्फ एक उपसर्ग)।
स्ट्रिंग से संख्या बनाने के लिए 4 कार्य हैं
String.to_integer
अच्छी तरह से काम करता है, लेकिन String.to_float
मुश्किल है:
iex()> "1 2 3 10 100" |> String.split |> Enum.map(&String.to_integer/1)
[1, 2, 3, 10, 100]
iex()> "1.0 1 3 10 100" |> String.split |> Enum.map(&String.to_float/1)
** (ArgumentError) argument error
:erlang.binary_to_float("1")
(elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2
(elixir) lib/enum.ex:1270: Enum."-map/2-lists^map/1-0-"/2
के रूप में String.to_float
: केवल अच्छी तरह फ़ॉर्मेट नाव, जैसे संभाल कर सकते हैं 1.0
, नहीं 1
(पूर्णांक)। यही कारण है कि में प्रलेखित किया गया String.to_float
है दस्तावेज़
एक फ्लोट देता है जिसका पाठ प्रतिनिधित्व स्ट्रिंग है।
स्ट्रिंग में दशमलव बिंदु सहित फ्लोट का स्ट्रिंग प्रतिनिधित्व होना चाहिए। दशमलव बिंदु के बिना एक स्ट्रिंग को एक फ्लोट के रूप में पार्स करने के लिए, फ़्लोट.परसे / 1 का उपयोग किया जाना चाहिए। अन्यथा, एक ArgumentError को उठाया जाएगा।
लेकिन Float.parse
2 तत्वों का एक टपल लौटाता है, न कि वह नंबर जो आप चाहते हैं, इसलिए इसे पाइपलाइन में डालें "कूल" नहीं है।
iex()> "1.0 1 3 10 100" |> String.split \
|> Enum.map(fn n -> {v, _} = Float.parse(n); v end)
[1.0, 1.0, 3.0, 10.0, 100.0]
elem
टपल से पहला तत्व प्राप्त करने के लिए उपयोग करने से यह छोटा और मीठा हो जाता है:
iex()> "1.0 1 3 10 100" |> String.split \
|> Enum.map(fn n -> Float.parse(n) |> elem(0) end)
[1.0, 1.0, 3.0, 10.0, 100.0]
आप इसे एक char_list में बदल सकते हैं और फिर Erlang to_integer/1
या का उपयोग कर सकते हैं to_float/1
।
उदाहरण के लिए
iex> {myInt, _} = :string.to_integer(to_char_list("23"))
{23, []}
iex> myInt
23
fn q -> {v, _} = Float.parse(q); v end
जो मुझे पसंद नहीं है। मुझे इसका उपयोग करना पसंद है Enum.map
, उदाहरण के लिए list |> Enum.map(&String.to_float/1)
लेकिन string.to_float पूर्णांक संख्याओं के लिए काम नहीं करता है?
Decimal.new("1") |> Decimal.to_integer
Decimal.new("1.0") |> Decimal.to_float
उपयोग करने के साथ समस्या यह Integer.parse/1
है कि स्ट्रिंग के किसी भी गैर-संख्यात्मक हिस्से को तब तक पार्स करेगा जब तक यह पूंछ के अंत में न हो। उदाहरण के लिए:
Integer.parse("01") # {1, ""}
Integer.parse("01.2") # {1, ".2"}
Integer.parse("0-1") # {0, "-1"}
Integer.parse("-01") # {-1, ""}
Integer.parse("x-01") # :error
Integer.parse("0-1x") # {0, "-1x"}
इसी प्रकार String.to_integer/1
निम्नलिखित परिणाम हैं:
String.to_integer("01") # 1
String.to_integer("01.2") # ** (ArgumentError) argument error :erlang.binary_to_integer("01.2")
String.to_integer("0-1") # ** (ArgumentError) argument error :erlang.binary_to_integer("01.2")
String.to_integer("-01") # -1
String.to_integer("x-01") # ** (ArgumentError) argument error :erlang.binary_to_integer("01.2")
String.to_integer("0-1x") # ** (ArgumentError) argument error :erlang.binary_to_integer("01.2")
इसके बजाय, पहले स्ट्रिंग को मान्य करें।
re = Regex.compile!("^[+-]?[0-9]*\.?[0-9]*$")
Regex.match?(re, "01") # true
Regex.match?(re, "01.2") # true
Regex.match?(re, "0-1") # false
Regex.match?(re, "-01") # true
Regex.match?(re, "x-01") # false
Regex.match?(re, "0-1x") # false
नियमित अभिव्यक्ति ^[0-9]*$
आपके उपयोग के मामले के आधार पर सरल (उदा ) हो सकती है ।
यदि आप स्ट्रिंग को किसी भी सांख्यिक प्रकार में बदलना चाहते हैं जो स्ट्रिंग के भीतर है और अन्य सभी वर्णों को हटा दें, तो यह संभवतया ओवरकिल है, लेकिन एक फ्लोट या एक इंट यदि एक स्ट्रिंग या एक इंट अगर इसकी स्ट्रिंग नहीं है, तो एक रिटर्न लौटाएगा एक संख्यात्मक प्रकार।
@spec string_to_numeric(binary()) :: float() | number() | nil
def string_to_numeric(val) when is_binary(val), do: _string_to_numeric(Regex.replace(~r{[^\d\.]}, val, ""))
defp _string_to_numeric(val) when is_binary(val), do: _string_to_numeric(Integer.parse(val), val)
defp _string_to_numeric(:error, _val), do: nil
defp _string_to_numeric({num, ""}, _val), do: num
defp _string_to_numeric({num, ".0"}, _val), do: num
defp _string_to_numeric({_num, _str}, val), do: elem(Float.parse(val), 0)
String.to_integer/1