এলিক্সির স্ট্রিংকে পূর্ণসংখ্যার বা ভাসমান রূপে রূপান্তর করুন


98

আমাকে একটি স্ট্রিংকে ভাসমান পয়েন্টের মান বা পূর্ণসংখ্যায় রূপান্তর করতে হবে। এর মতো কোনও পদ্ধতি ছিল না,

string_to_integer

উত্তর:


154

চেক Integer.parse/1এবং Float.parse/1


37
দ্রষ্টব্য যে এটি কোনও দ্বিধা ফিরবে (যদি সফল হয়) এবং সরাসরি পূর্ণসংখ্যা হয় না। যদি আপনি এটি করতে চান তবে @ সায়মন জে'র উত্তরটি দেখুনString.to_integer/1

6
Integer.parse/1ওভার ব্যবহার করার কোনও কারণ আছে String.to_integer/1?
আয়ান ভাগান

10
@ ইয়ানভাগান যদি ব্যর্থ হয় তবে পরমাণু Integer.parse/1ফেরত দেয় :errorString.to_integer/1নিক্ষেপ a (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অন্যান্য রূপান্তরের জন্য।


28

এই পৃষ্ঠায় ধন্যবাদ জানুন, এখানে একটি উত্তর সহজতর করে:

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

যেহেতু এটি যাচাই করে যে পুরো স্ট্রিংটি পার্স করা হয়েছে (কেবলমাত্র একটি উপসর্গ নয়)।


ভালটি নির্ভুলভাবে পূর্ণসংখ্যা না হলে এটি একটি ত্রুটি ফেলবে। রূপান্তরটি সফল হয়েছিল তা নিশ্চিত করতে আমি ফলাফলের উপর একটি কেস যুক্ত করেছি। দ্বিতীয় ধারাটি ধরার জন্য জেনেরিক হতে পারে: ত্রুটি বা একটি খালি খালি দ্বিতীয় স্ট্রিং হিসাবে আপনি ইনপুটটি "x3" বা "3x" কিনা সেদিকে বেশি খেয়াল রাখেন না।
সিনপ

14

স্ট্রিং থেকে সংখ্যা তৈরি করতে 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]

11

আপনি এটিকে একটি চর_ তালিকায় রূপান্তর করতে পারেন এবং তারপরে এরলং 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)তবে স্ট্রিং.টো_ফ্লোট পূর্ণসংখ্যার জন্য কাজ করে না?
ঝোমার্ট

5
Decimal.new("1") |> Decimal.to_integer
Decimal.new("1.0") |> Decimal.to_float

4
আইএমও এটি সেরা উত্তর।
মার্সিন অ্যাডামজিক

আমি এই ত্রুটিটি পেয়েছি: ** (UndefinedFunctionError) ফাংশন ডেসিমাল।নিউ / 1 অপরিজ্ঞাত (মডিউল দশমিক উপলব্ধ নেই)
ড্যানিয়েল কুকিয়ার

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.