কোনও চলকটি পূর্ণসংখ্যা কিনা তা পরীক্ষা করা হচ্ছে


137

ভেরিয়েবলটি পূর্ণসংখ্যা কিনা তা পরীক্ষা করার জন্য কি রেলস 3 বা রুবির অন্তর্নির্মিত উপায় আছে?

উদাহরণ স্বরূপ,

1.is_an_int #=> true
"dadadad@asdasd.net".is_an_int #=> false?


1
ভেরিয়েবলটি একটি পূর্ণসংখ্যা কিনা তা যত্ন নেওয়ার পরিবর্তে ভেরিয়েবলটি তার প্রতিক্রিয়া জানায় কিনা তা পরীক্ষা করা উচিত to_i। এটি রুবির "হাঁসের টাইপিং" এর অংশ: এটি যদি কোনও পূর্ণসংখ্যার মতো কাজ করতে পারে তবে এটির মতো আচরণ করুন।
টিন ম্যান

4
@ টিন ম্যান: পুরোপুরি নয়। "হ্যালো"। টু_ আমি 0 প্রত্যাবর্তন করে যা আপনি প্রত্যাশা করেন না।
আইনলামা

1
@ অ্যানপ্রেন্টিস আপনার তথ্যের জন্য, kind_of?একটি উপনাম is_a?
জ্যাকব রিলকিন

3
@ জ্যাকব্রেলকিন is_a?কিছুটা আলাদা; এটি জিজ্ঞাসা করে যে কোনও নির্দিষ্ট শ্রেণীর উদাহরণের উদ্দেশ্য; kind_of?এটি কোনও নির্দিষ্ট শ্রেণীর উদাহরণ বা শিশু কিনা জিজ্ঞাসা করে। fido.is_a? Dogসত্য; fido.kind_of? Animalউদাহরণস্বরূপ সত্য is
টম হ্যারিসন

উত্তর:


274

আপনি is_a?পদ্ধতিটি ব্যবহার করতে পারেন

>> 1.is_a? Integer
=> true
>> "dadadad@asdasd.net".is_a? Integer
=> false
>> nil.is_a? Integer
=> false

2
খুব সুন্দর। ইমেল ঠিকানাগুলি যাচাই করার জন্য এটি কাজ করে?
অ্যানপ্রেন্টিস

65
@ অ্যানপ্রেন্টিস কখন থেকে ইমেল ঠিকানাগুলিকে প্রশ্নের অংশ হিসাবে যাচাই করছিল?
জ্যাকব রিলকিন

4
এই সংখ্যাটি যদি "11111111" এর মতো স্ট্রিংয়ে আসে তবে এই কাজ করবে না
রিকবার্মো

নীচে দেখুন Integer(obj) rescue false এটি "1" এর জন্য কাজ করবে না যদি আপনি এটি পরীক্ষা করে দেখতে চান
এমসি।

4
@ রিকবারমো "1111111" একটি স্ট্রিং। একটি স্ট্রিং যা রূপান্তরযোগ্য এবং পূর্ণসংখ্যার হতে পারে।
স্কেয়াকি

50

যদি আপনি জানতে চান যে কোনও বস্তুটি একটি Integer বা এমন কিছু যা অর্থপূর্ণভাবে পূর্ণসংখ্যায় রূপান্তরিত হতে পারে (যেমন এমন জিনিসগুলিতে নয় "hello"যা to_iরূপান্তর করবে 0):

result = Integer(obj) rescue false

2
হতে পারে আমি কেবল নুব, তবে এই টুইটটি আমাকে সাহায্য করবে। ফলাফল = পূর্ণসংখ্যা (আপত্তি) রেসকিউ মিথ্যা।
জন কারি

@ জনকিউরি, উত্তরটি উন্নত করতে পারলে নির্দ্বিধায় যোগাযোগ করুন এসও এভাবে কাজ করে।
অ্যালেক্স

2
আমি করেছি, এটা প্রত্যাখ্যান হয়েছে। "এই সম্পাদনাটি পোস্টের মূল উদ্দেশ্য থেকে বিচ্যুত হয়" তবে নির্বিশেষে, আপনার উত্তরের জন্য আপনাকে ধন্যবাদ, এটি আমার সমস্যা সমাধানে আমাকে সহায়তা করেছিল!
জন কারি

7
পূর্ণসংখ্যা ('08 ') ব্যর্থ হবে কারণ স্ট্রিংটিকে অষ্টাল হিসাবে ব্যাখ্যা করা হচ্ছে, পূর্ণসংখ্যা ('08', 10) ভাল কাজ করে। শুধু ক্ষেত্রে।
জং বোর লি

1
Integer(2.5) => 2সর্বদা অর্থবহ রূপান্তর কিনা তা নিশ্চিত নয় ।
মকতাজা

29

একটি স্ট্রিং এ নিয়মিত এক্সপ্রেশন ব্যবহার করুন:

def is_numeric?(obj) 
   obj.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true
end

কোনও ভেরিয়েবল নির্দিষ্ট ধরণের কিনা তা যদি আপনি পরীক্ষা করতে চান তবে আপনি কেবল ব্যবহার করতে পারেন kind_of?:

1.kind_of? Integer #true
(1.5).kind_of? Float #true
is_numeric? "545"  #true
is_numeric? "2aa"  #false

এটি হ'ল আমি কী_সংখ্যকটি খুঁজছিলাম?
workdreamer

আমি মনে করি এটি নিকটে, তবে ঠিক সঠিক নয়। উদাহরণস্বরূপ, এটি ".34" এর জন্য ব্যর্থ হবে। সমস্যা নেই, আমি মনে করি, হয় নির্দিষ্ট করে একটি অ-লোভী ম্যাচ, আপনি যেহেতু সম্ভবত একটি ঐচ্ছিক ম্যাচ চাই। এটি ঠিক করতে পরিবর্তিত হতে পারে, তবে আমি নিশ্চিত হতে এটি পরীক্ষার স্যুট দিয়ে চালাতে চাই। এটি হেক্স বা তাত্পর্যপূর্ণ স্বরলিপিটির সাথেও মেলে না, তবে আমি নিশ্চিত যে এটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে ভাল। \d+??\d+?\d*
জেফ

1
না শুধু এই regexp ব্যবহার করতে কেন: \A\d+\z?
নারকোজ

1
Integer(obj) rescue falseনীচে @ অ্যালেক্স-ডি থেকে কোডের সাথে তুলনা করুন ; রিজেএক্সপেক্ট পড়া কঠিন এবং এর উদ্দেশ্যতে পরিষ্কার নয়। উভয়ই কাজ, আমি সবসময় কাজ করে না এমন একটি খারাপভাবে নির্মিত রেজিএক্সএক্স ঠিক করার প্রয়াসে এই প্রশ্নে এসেছি:
টম হ্যারিসন

17

আপনি যদি ভেরিয়েবলের ধরণের সম্পর্কে অনিশ্চিত হন (এটি সংখ্যার অক্ষরের একটি স্ট্রিং হতে পারে), বলুন এটি একটি ক্রেডিট কার্ড নম্বর ছিল যেগুলি প্যারামগুলিতে পাস হয়েছিল, সুতরাং এটি মূলত একটি স্ট্রিং হবে তবে আপনি নিশ্চিত করতে চান যে এটি অক্ষম নয় ' এতে কোনও বর্ণের অক্ষর নেই, আমি এই পদ্ধতিটি ব্যবহার করব:

    def is_number?(obj)
        obj.to_s == obj.to_i.to_s
    end

    is_number? "123fh" # false
    is_number? "12345" # true

@ বেনি এই পদ্ধতির একটি নজরদারি দেখায়, এটি মনে রাখবেন:

is_number? "01" # false. oops!

ধন্যবাদ, আপনি আমার দিন বাঁচান যে কারও জন্য এটি পরীক্ষা করা দরকার কিনা এটি ভাসমান কিনা তা সরাসরি obj.to_s == obj.to_f.to_sআমার ক্ষেত্রে যেমন ঠিক তেমন পরিবর্তন করতে পারে ।
ksugiarto

এডমন্ড যে চালাক! 🙌
সিওয়ালিক্ম

দুর্দান্ত, আমি এটি পূর্ণসংখ্যার ('123fh') এবং রেসকিউ ব্যতিক্রমের চেয়ে পছন্দ করি।
zw963

6

আপনি ট্রিপল সমান ব্যবহার করতে পারেন।

if Integer === 21 
    puts "21 is Integer"
end

5

আছে var.is_a? Class(আপনার ক্ষেত্রে var.is_a? Integer:); যে বিল মাপসই করা যেতে পারে। বা আছে Integer(var), যেখানে এটি ব্যতিক্রম করতে না পারলে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে।


3

আরও একটি "হাঁসের টাইপিং" উপায়টি এইভাবে ব্যবহার করা হয় respond_to?"পূর্ণসংখ্যার মতো" বা "স্ট্রিং-জাতীয়" শ্রেণিগুলিও ব্যবহার করা যেতে পারে

if(s.respond_to?(:match) && s.match(".com")){
  puts "It's a .com"
else
  puts "It's not"
end

2

যদি আপনি, শূন্য মান রূপান্তর করতে আমি পদ্ধতি খুঁজে প্রয়োজন হবে না to_iএবং to_fঅত্যন্ত দরকারী হতে যেহেতু তারা স্ট্রিং হয় একটি শূন্য মান (যদি পরিবর্তনীয় না বা শূন্য) অথবা প্রকৃত রূপান্তর করবে Integerবা Floatমান।

"0014.56".to_i # => 14
"0014.56".to_f # => 14.56
"0.0".to_f # => 0.0
"not_an_int".to_f # 0
"not_a_float".to_f # 0.0

"0014.56".to_f ? "I'm a float" : "I'm not a float or the 0.0 float" 
# => I'm a float
"not a float" ? "I'm a float" : "I'm not a float or the 0.0 float" 
# => "I'm not a float or the 0.0 float"

সম্পাদনা 2: সতর্কতা অবলম্বন করুন, 0পূর্ণসংখ্যার মানটি মিথ্যা নয় এটি সত্যবাদী ( !!0 #=> true) (ধন্যবাদ @ ব্যাখ্যা ট্র্যাকার)

সম্পাদনা

আহ সবেমাত্র অন্ধকার কেসগুলি সম্পর্কে জানতে পেরেছিল ... মনে হচ্ছে কেবল তখনই সংখ্যাটি প্রথম অবস্থানে থাকলে

"12blah".to_i => 12

0 রুবিতে সত্য!
কোডার

1
মাথাব্যথার জন্য @ বিপর্যয়কোডার ধন্যবাদ, আমি উত্তরে তাৎক্ষণিকভাবে এটি ঠিক করব
সিরিল ডুচন-ডরিস

1

পুঁজিতে করার অ্যালেক্স ডি এর উত্তর ব্যবহার পরিমার্জনা :

module CoreExtensions
  module Integerable
    refine String do
      def integer?
        Integer(self)
      rescue ArgumentError
        false
      else
        true
      end
    end
  end
end

পরে, আপনার ক্লাসে:

require 'core_ext/string/integerable'

class MyClass
  using CoreExtensions::Integerable

  def method
    'my_string'.integer?
  end
end

0

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

if column.class < Numeric
  number_to_currency(column)
else
  column.html_safe
end

এই পরিস্থিতিতে, আপনি সংখ্যার বংশধরদেরও বিকল্প হিসাবে বেছে নিতে পারেন: বিগডিসিমাল, তারিখ :: অনন্ত, পূর্ণসংখ্যা, ফিক্সনাম, ফ্লোট, বিগনাম, যুক্তিবাদী, জটিল


-1

সম্ভবত আপনি এই জাতীয় কিছু খুঁজছেন:

"2.0 বা 2.0 কে INT হিসাবে স্বীকার করুন তবে ২.১ এবং" ২.১ "প্রত্যাখ্যান করুন

num = 2.0

যদি num.is_a? স্ট্রিং নাম্বা = ভাসা (num) রেসকিউ মিথ্যা শেষ

new_num = পূর্ণসংখ্যা (সংখ্যা) রেসকিউ মিথ্যা

নাম্বার রাখে

new_num রাখে

নাম্বার রাখে == নতুন_নাম

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