Tl; dr: একটি রেজেক্স পদ্ধতির ব্যবহার করুন। এটি গ্রহণযোগ্য উত্তরে উদ্ধার পদ্ধতির চেয়ে 39x গতিযুক্ত এবং "1000" এর মতো মামলাগুলি পরিচালনা করে
def regex_is_number? string
no_commas = string.gsub(',', '')
matches = no_commas.match(/-?\d+(?:\.\d+)?/)
if !matches.nil? && matches.size == 1 && matches[0] == no_commas
true
else
false
end
end
-
@ জ্যাকব এস-এর গৃহীত উত্তর বেশিরভাগ অংশের জন্য কাজ করে, তবে ব্যতিক্রম ধরা সত্যিই ধীর হতে পারে। এছাড়াও, "1000" এর মতো স্ট্রিংয়ে উদ্ধার পদ্ধতির ব্যর্থতা রয়েছে।
আসুন পদ্ধতিগুলি সংজ্ঞা দিন:
def rescue_is_number? string
true if Float(string) rescue false
end
def regex_is_number? string
no_commas = string.gsub(',', '')
matches = no_commas.match(/-?\d+(?:\.\d+)?/)
if !matches.nil? && matches.size == 1 && matches[0] == no_commas
true
else
false
end
end
এবং এখন কিছু পরীক্ষার কেস:
test_cases = {
true => ["5.5", "23", "-123", "1,234,123"],
false => ["hello", "99designs", "(123)456-7890"]
}
এবং পরীক্ষার কেসগুলি চালানোর জন্য একটি ছোট কোড:
test_cases.each do |expected_answer, cases|
cases.each do |test_case|
if rescue_is_number?(test_case) != expected_answer
puts "**rescue_is_number? got #{test_case} wrong**"
else
puts "rescue_is_number? got #{test_case} right"
end
if regex_is_number?(test_case) != expected_answer
puts "**regex_is_number? got #{test_case} wrong**"
else
puts "regex_is_number? got #{test_case} right"
end
end
end
এখানে পরীক্ষার কেসগুলির আউটপুট দেওয়া হচ্ছে:
rescue_is_number? got 5.5 right
regex_is_number? got 5.5 right
rescue_is_number? got 23 right
regex_is_number? got 23 right
rescue_is_number? got -123 right
regex_is_number? got -123 right
**rescue_is_number? got 1,234,123 wrong**
regex_is_number? got 1,234,123 right
rescue_is_number? got hello right
regex_is_number? got hello right
rescue_is_number? got 99designs right
regex_is_number? got 99designs right
rescue_is_number? got (123)456-7890 right
regex_is_number? got (123)456-7890 right
কিছু কর্মক্ষমতা মানদণ্ড করার সময়:
Benchmark.ips do |x|
x.report("rescue") { test_cases.values.flatten.each { |c| rescue_is_number? c } }
x.report("regex") { test_cases.values.flatten.each { |c| regex_is_number? c } }
x.compare!
end
এবং ফলাফল:
Calculating -------------------------------------
rescue 128.000 i/100ms
regex 4.649k i/100ms
-------------------------------------------------
rescue 1.348k (±16.8%) i/s - 6.656k
regex 52.113k (± 7.8%) i/s - 260.344k
Comparison:
regex: 52113.3 i/s
rescue: 1347.5 i/s - 38.67x slower