আমাকে একটি স্ট্রিংকে ভাসমান পয়েন্টের মান বা পূর্ণসংখ্যায় রূপান্তর করতে হবে। এর মতো কোনও পদ্ধতি ছিল না,
string_to_integer
উত্তর:
চেক Integer.parse/1
এবং Float.parse/1
।
Integer.parse/1
ওভার ব্যবহার করার কোনও কারণ আছে String.to_integer/1
?
Integer.parse/1
ফেরত দেয় :error
। String.to_integer/1
নিক্ষেপ a (FunctionClauseError)
।
এই পৃষ্ঠায় ধন্যবাদ জানুন, এখানে একটি উত্তর সহজতর করে:
{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 ব্যবহার করা উচিত। অন্যথায়, একটি আর্গুমেন্ট ইরার উত্থাপিত হবে।
তবে 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]
আপনি এটিকে একটি চর_ তালিকায় রূপান্তর করতে পারেন এবং তারপরে এরলং 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)
তবে স্ট্রিং.টো_ফ্লোট পূর্ণসংখ্যার জন্য কাজ করে না?
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