जवाबों:
जाँच करें 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.parse2 तत्वों का एक टपल लौटाता है, न कि वह नंबर जो आप चाहते हैं, इसलिए इसे पाइपलाइन में डालें "कूल" नहीं है।
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