अमृत ​​स्ट्रिंग को पूर्णांक या फ्लोट में बदलें


97

मुझे एक स्ट्रिंग को एक अस्थायी बिंदु मान या पूर्णांक में बदलने की आवश्यकता है। कोई विधि नहीं थी जैसे,

string_to_integer

जवाबों:


153

जाँच करें Integer.parse/1और Float.parse/1


36
ध्यान दें कि यह एक टपल लौटाएगा (यदि सफल) और सीधे पूर्णांक नहीं। यदि आप ऐसा करना चाहते हैं, तो @Szymon Je with उत्तर को देखेंString.to_integer/1

6
वहाँ का उपयोग करने के किसी भी कारण है Integer.parse/1से अधिक String.to_integer/1?
इयान

10
@IanVaughan असफल होने पर Integer.parse/1एक :errorपरमाणु लौटाता है । String.to_integer/1फेंकता है (FunctionClauseError)
जोनाथन सोइफर

52

जोस ने सुझाव दिया है कि कार्यों 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अन्य रूपांतरण के लिए।


27

इस पृष्ठ पर लोगों को धन्यवाद, बस यहाँ एक जवाब को सरल बनाने:

{intVal, ""} = Integer.parse(val)

जैसा कि यह पुष्टि करता है कि पूरे स्ट्रिंग को पार्स किया गया था (न कि सिर्फ एक उपसर्ग)।


यदि घाटी पूरी तरह से पूर्णांक नहीं है, तो यह एक त्रुटि देगा। रूपांतरण सुनिश्चित करने के लिए मैंने परिणाम पर एक मामला जोड़ा। दूसरा खंड पकड़ने के लिए सामान्य हो सकता है: त्रुटि या एक गैर-खाली दूसरी स्ट्रिंग क्योंकि आप बहुत परवाह नहीं करते हैं कि क्या इनपुट "x3" या "3x" था।
Sinc

14

स्ट्रिंग से संख्या बनाने के लिए 4 कार्य हैं

  • String.to_integer, String.to_float
  • इंटेगर.पर्स, फ्लोट.परसे

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]

11

आप इसे एक 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 पूर्णांक संख्याओं के लिए काम नहीं करता है?
झोमार्ट


4

उपयोग करने के साथ समस्या यह 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]*$आपके उपयोग के मामले के आधार पर सरल (उदा ) हो सकती है ।


0

यदि आप स्ट्रिंग को किसी भी सांख्यिक प्रकार में बदलना चाहते हैं जो स्ट्रिंग के भीतर है और अन्य सभी वर्णों को हटा दें, तो यह संभवतया ओवरकिल है, लेकिन एक फ्लोट या एक इंट यदि एक स्ट्रिंग या एक इंट अगर इसकी स्ट्रिंग नहीं है, तो एक रिटर्न लौटाएगा एक संख्यात्मक प्रकार।

@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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.