আমার একটা ফাংশন দরকার is_an_integer
, যেখানে
"12".is_an_integer?
সত্য ফিরে।"blah".is_an_integer?
মিথ্যা প্রত্যাবর্তন
আমি রুবিতে এটি কীভাবে করতে পারি? আমি একটি রেজেক্স লিখব তবে আমি ধরে নিচ্ছি যে এর জন্য কোনও সহায়ক রয়েছে যা আমি অবগত নই।
আমার একটা ফাংশন দরকার is_an_integer
, যেখানে
"12".is_an_integer?
সত্য ফিরে।"blah".is_an_integer?
মিথ্যা প্রত্যাবর্তনআমি রুবিতে এটি কীভাবে করতে পারি? আমি একটি রেজেক্স লিখব তবে আমি ধরে নিচ্ছি যে এর জন্য কোনও সহায়ক রয়েছে যা আমি অবগত নই।
উত্তর:
আপনি নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন। @ জ্যানমের পরামর্শ সহ ফাংশনটি এখানে।
class String
def is_i?
!!(self =~ /\A[-+]?[0-9]+\z/)
end
end
@ উইচের মন্তব্য অনুসারে একটি সম্পাদিত সংস্করণ:
class String
def is_i?
/\A[-+]?\d+\z/ === self
end
end
যদি আপনাকে কেবল ইতিবাচক সংখ্যাগুলি পরীক্ষা করতে হয় check
if !/\A\d+\z/.match(string_to_check)
#Is not a positive number
else
#Is all good ..continue
end
/regexp/ === self
পরিবর্তে ব্যবহার করতে পারেন !!(self =~ /regexp/)
। পরিবর্তে আপনি চরিত্র শ্রেণী '\ ঘ' ব্যবহার করতে পারেন[0-9]
ভাল, এখানে সহজ উপায়:
class String
def is_integer?
self.to_i.to_s == self
end
end
>> "12".is_integer?
=> true
>> "blah".is_integer?
=> false
স্ট্রিংগুলিতে রূপান্তর করতে ব্যতিক্রমের জন্য উত্সাহিত হওয়া সমাধানগুলির সাথে আমি একমত নই - ব্যতিক্রমগুলি নিয়ন্ত্রণ প্রবাহ নয়, এবং আপনি সম্ভবত এটি সঠিক উপায়ে করতে পারেন। এটি বলেছে, উপরের আমার সমাধানটি বেস -10-পূর্ণসংখ্যার সাথে কাজ করে না। সুতরাং ব্যতিক্রমগুলি অবলম্বন না করেই উপায়টি এখানে:
class String
def integer?
[ # In descending order of likeliness:
/^[-+]?[1-9]([0-9]*)?$/, # decimal
/^0[0-7]+$/, # octal
/^0x[0-9A-Fa-f]+$/, # hexadecimal
/^0b[01]+$/ # binary
].each do |match_pattern|
return true if self =~ match_pattern
end
return false
end
end
self.to_i.to_s == self
সঙ্গে Integer self rescue false
?
আপনি এটি ব্যবহার করতে পারেন Integer(str)
এবং এটি উত্থাপিত কিনা তা দেখতে পারেন:
def is_num?(str)
!!Integer(str)
rescue ArgumentError, TypeError
false
end
এটি উল্লেখ করা উচিত যে এটি যখন সত্য হয় তবে "01"
এটি কার্যকর হয় না "09"
কারণ 09
এটি একটি বৈধ পূর্ণসংখ্যার আক্ষরিক হবে না। যদি এটি আপনি চান এমন আচরণ না হয় তবে আপনি 10
দ্বিতীয় যুক্তি হিসাবে যুক্ত করতে পারেন Integer
, তাই সংখ্যাটি সর্বদা বেস 10 হিসাবে ব্যাখ্যা করা হয়।
#to_i
অনুমতি দেওয়ার কারণে ব্যবহারের পদ্ধতিগুলি কেবল খুব বেশি ভাঙা।
Integer()
প্রচলিত কারণ এটি Integer ()
আপনার পক্ষে নিশ্চিতভাবেই জানেন যে রুবি যে কোনও পূর্ণসংখ্যাকে আক্ষরিক হিসাবে বিবেচনা করে তা গ্রহণযোগ্য হবে এবং সমস্ত কিছু প্রত্যাখ্যান করা হবে। ভাষাটি ইতিমধ্যে আপনাকে যা দেয় তা অনুলিপি করা নিয়ন্ত্রণের জন্য ব্যতিক্রমগুলি ব্যবহার করার চেয়ে যুক্তিযুক্তভাবে আরও খারাপ কোড গন্ধ।
আপনি একটি ওলাইনার করতে পারেন:
str = ...
int = Integer(str) rescue nil
if int
int.times {|i| p i}
end
অথবা এমনকি
int = Integer(str) rescue false
আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে আপনি সরাসরি রেসকিউ ক্লজ সহ একটি স্টার্ট এন্ড ব্লকটি ব্যবহার করতে পারেন:
begin
str = ...
i = Integer(str)
i.times do |j|
puts j
end
rescue ArgumentError
puts "Not an int, doing something else"
end
"12".match(/^(\d)+$/) # true
"1.2".match(/^(\d)+$/) # false
"dfs2".match(/^(\d)+$/) # false
"13422".match(/^(\d)+$/) # true
true
এবং false
কিন্তু MatchData
দৃষ্টান্ত এবংnil
!!
বা ব্যবহারের present?
আপনি একটি বুলিয়ান প্রয়োজন !!( "12".match /^(\d)+$/ )
বা "12".match(/^(\d)+$/).present?
(আধুনিক প্রয়োজন পাগল / activesupport)
রুবি ২..0.০ ব্যতিক্রম না বাড়িয়ে পূর্ণসংখ্যায় কাস্টিং সক্ষম করে এবং nil
কাস্ট ব্যর্থ হলে ফিরে আসবে । এবং যেহেতু nil
বেশিরভাগ false
রুবির মতোই আচরণ করে , আপনি সহজেই এর মতো পূর্ণসংখ্যার জন্য পরীক্ষা করতে পারেন:
if Integer(my_var, exception: false)
# do something if my_var can be cast to an integer
end
class String
def integer?
Integer(self)
return true
rescue ArgumentError
return false
end
end
is_
। আমি প্রশ্নোত্তর পদ্ধতিতে যে নির্বোধ, আমি "04".integer?
তার চেয়ে অনেক বেশি পছন্দ করি "foo".is_integer?
।"01"
এরকম এবং এরূপ হয়ে যায়।integer?("a string")
ftl।
String#integer?
প্রতিটি রুবি কোডার এবং তাদের কাজিনকে ভাষাতে যুক্ত করতে পছন্দ করার মতো ধরণের সাধারণ প্যাচটি হ'ল তিনটি সাবলেটলি বেমানান বাস্তবায়ন এবং অপ্রত্যাশিত ভাঙ্গন সহ কোডবেসগুলিতে নেতৃত্ব দেয়। আমি বড় রুবি প্রকল্পগুলিতে এই কঠিন উপায়ে শিখেছি।
সেরা এবং সহজ উপায় ব্যবহার করা হয় Float
val = Float "234" rescue nil
Float "234" rescue nil #=> 234.0
Float "abc" rescue nil #=> nil
Float "234abc" rescue nil #=> nil
Float nil rescue nil #=> nil
Float "" rescue nil #=> nil
Integer
এছাড়াও ভাল তবে এটির 0
জন্য ফিরে আসবেInteger nil
আমি পছন্দ করি:
কনফিগ / initializers / string.rb
class String
def number?
Integer(self).is_a?(Integer)
rescue ArgumentError, TypeError
false
end
end
এবং তারপর:
[218] pry(main)> "123123123".number?
=> true
[220] pry(main)> "123 123 123".gsub(/ /, '').number?
=> true
[222] pry(main)> "123 123 123".number?
=> false
বা ফোন নম্বর পরীক্ষা করুন:
"+34 123 456 789 2".gsub(/ /, '').number?
অনেক সহজ উপায় হতে পারে
/(\D+)/.match('1221').nil? #=> true
/(\D+)/.match('1a221').nil? #=> false
/(\D+)/.match('01221').nil? #=> true
def isint(str)
return !!(str =~ /^[-+]?[1-9]([0-9]*)?$/)
end
ব্যাক্তিগতভাবে আমি ব্যতিক্রম পদ্ধতির পছন্দ করি যদিও আমি এটিকে কিছুটা পরিশ্রুত করে তুলব:
class String
def integer?(str)
!!Integer(str) rescue false
end
end
তবে অন্যরা যেমন ইতিমধ্যে জানিয়েছে, এটি অষ্টাল স্ট্রিংয়ের সাথে কাজ করে না।
রুবি ২.৪ এর রয়েছে Regexp#match?
: (ক ?
)
def integer?(str)
/\A[+-]?\d+\z/.match? str
end
পুরানো রুবি সংস্করণগুলির জন্য, রয়েছে Regexp#===
। এবং যদিও ক্ষেত্রে সাম্যতা অপারেটরের সরাসরি ব্যবহার এড়ানো উচিত, এটি এখানে খুব পরিষ্কার দেখাচ্ছে:
def integer?(str)
/\A[+-]?\d+\z/ === str
end
integer? "123" # true
integer? "-123" # true
integer? "+123" # true
integer? "a123" # false
integer? "123b" # false
integer? "1\n2" # false
এটি সহজভাবে ব্যবহার করে সমস্ত ক্ষেত্রে উপযুক্ত নাও হতে পারে:
"12".to_i => 12
"blah".to_i => 0
কিছু জন্য হতে পারে।
যদি এটি একটি সংখ্যা এবং 0 নয় তবে এটি একটি নম্বর ফেরত দেবে। যদি এটি 0 প্রদান করে তবে এটি স্ট্রিং বা 0 হয়।
"12blah".to_i => 12
। এটি অদ্ভুত পরিস্থিতিতে কিছুটা সমস্যা তৈরি করতে পারে।
এখানে আমার সমাধান:
# /initializers/string.rb
class String
IntegerRegex = /^(\d)+$/
def integer?
!!self.match(IntegerRegex)
end
end
# any_model_or_controller.rb
'12345'.integer? # true
'asd34'.integer? # false
এবং এটি কীভাবে কাজ করে তা এখানে:
/^(\d)+$/
যে কোনও স্ট্রিংয়ের অঙ্কগুলি খুঁজে পাওয়ার জন্য রেজেক্স এক্সপ্রেশন। আপনি আপনার রেজেক্স এক্সপ্রেশন এবং ফলাফল http://rubular.com/ এ পরীক্ষা করতে পারেন ।IntegerRegex
যখনই পদ্ধতিতে এটি ব্যবহার করি তখন অপ্রয়োজনীয় মেমরির বরাদ্দ এড়াতে আমরা অবিচ্ছিন্নভাবে এটি সংরক্ষণ করি ।integer?
একটি জিজ্ঞাসা পদ্ধতি যা আসতে হবে true
বা false
।match
স্ট্রিংয়ের একটি পদ্ধতি যা আর্গুমেন্টে প্রদত্ত রেজেক্স এক্সপ্রেশন অনুসারে সংঘটনগুলির সাথে মেলে এবং মিলিত মানগুলি বা ফেরত দেয় nil
।!!
match
পদ্ধতির ফলাফলকে সমতুল বুলিয়ান রূপান্তর করে ।String
ক্লাসে পদ্ধতিটি ঘোষণা করা হচ্ছে বানর প্যাচিং, যা বিদ্যমান স্ট্রিং কার্যকারিতাতে কোনও কিছুই পরিবর্তন করে না, তবে কেবল integer?
স্ট্রিং অবজেক্টের নামে অন্য একটি পদ্ধতি যুক্ত করে ।উপরে উপরে @ রাডোর জবাব প্রসারিত করা ডাবল ব্যাংস ব্যবহার না করে সত্য বা মিথ্যা বুলেটিয়ানদের ফিরে আসতে বাধ্য করার জন্য একটি ত্রৈমাসিক বিবৃতিও ব্যবহার করতে পারে। মঞ্জুর, ডাবল লজিকাল নেগ্রেশন সংস্করণটি আরও সংক্ষিপ্ত, তবে সম্ভবত নতুনদের জন্য পড়া আমার পক্ষে (আমার মতো) বেশি শক্ত।
class String
def is_i?
self =~ /\A[-+]?[0-9]+\z/ ? true : false
end
end
আরও সাধারণীকরণের ক্ষেত্রে (দশমিক পয়েন্ট সহ সংখ্যা সহ), আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন:
def number?(obj)
obj = obj.to_s unless obj.is_a? String
/\A[+-]?\d+(\.[\d]+)?\z/.match(obj)
end
আপনি কোনও আইআরবি সেশনে এই পদ্ধতিটি পরীক্ষা করতে পারেন:
(irb)
>> number?(7)
=> #<MatchData "7" 1:nil>
>> !!number?(7)
=> true
>> number?(-Math::PI)
=> #<MatchData "-3.141592653589793" 1:".141592653589793">
>> !!number?(-Math::PI)
=> true
>> number?('hello world')
=> nil
>> !!number?('hello world')
=> false
এখানে জড়িত রেজেক্সের বিশদ ব্যাখ্যার জন্য, এই ব্লগ নিবন্ধটি পরীক্ষা করে দেখুন :)
obj.is_a? String
কারণ স্ট্রিং # টু_স নিজেই ফিরে আসবে, যা আমার ধারণা .is_a?
কলটির সাথে তুলনা করে খুব বেশি প্রসেসিংয়ের প্রয়োজন হবে না । এইভাবে, আপনি এই লাইনে একটি বা দু'জনের পরিবর্তে কেবলমাত্র একটি কল করবেন। এছাড়াও, আপনি সরাসরি পদ্ধতির !!
অভ্যন্তরে অন্তর্ভুক্ত করতে পারেন number?
, কারণ কনভেনশন অনুসারে, এমন একটি পদ্ধতির নাম যা শেষ হয় ?
বুলিয়ান মানটি প্রত্যাবর্তন করে। শুভেচ্ছা সহ!
আমি নীচেরটি পছন্দ করি, সরাসরি এগিয়ে:
def is_integer?(str)
str.to_i != 0 || str == '0' || str == '-0'
end
is_integer?('123')
=> true
is_integer?('sdf')
=> false
is_integer?('-123')
=> true
is_integer?('0')
=> true
is_integer?('-0')
=> true
যত্নবান যদিও:
is_integer?('123sdfsdf')
=> true
আমি নিশ্চিত নই যে এই প্রশ্নটি যখন জিজ্ঞাসা করা হয়েছিল তখনই এটি ছিল কিনা তবে যে কেউ এই পোস্ট জুড়ে হোঁচট খায় তার পক্ষে সহজতম উপায়:
var = "12"
var.is_a?(Integer) # returns false
var.is_a?(String) # returns true
var = 12
var.is_a?(Integer) # returns true
var.is_a?(String) # returns false
.is_a?
যে কোনও বস্তুর সাথে কাজ করবে।
"12".is_an_integer? == true
"not12".is_an_integer? == false
12.is_an_integer? == true