我正在上课的抵押贷款计算器。我有一种方法来确定该值是否为浮点数,同上有效数字,同上整数。如果该号码是有效号码
我尝试使用if valid_number?(apr) && float?(apr)
,该整数返回true。
def valid_number?(input)
integer?(input) || float?(input)
end
def integer?(input)
/^\d+$/.match(input)
end
def float?(input)
/\d/.match(input) && /^\d*\.?\d*$/.match(input)
end
apr = gets.chomp
if valid_number?(apr)
if float?(apr)
puts "Is #{apr}% correct? Y or n"
end
end
我希望任何不包含小数的内容对于浮点数都是假的?方法,但是如果我不输入小数点,则我的程序似乎不在乎。
答案 0 :(得分:0)
简单而强大的方法是完全不使用正则表达式。为什么要关心字符串的外观?您真正关心的是Ruby是否可以真正将该字符串转换转换为int / float。为此,请使用内置的Integer
和Float
方法:
def integer?(input)
Integer(input)
true
rescue
false
end
def float?(input)
Float(input)
true
rescue
false
end
如果最后没有得到转换后的值,检查字符串是否可以转换的意义何在?结合一切:
def number string
begin
return Integer(string)
rescue
return Float(string)
end
rescue
nil
end
if num = number input
# now num is some number type: Fixnum/Bignum/Float
end
答案 1 :(得分:-1)
您可能只想将表达式包装在捕获组中,它将传递浮点数,而使其他表达式失败。
re = /([0-9]+\.[0-9]+)/m
str = '1
1000
1.00
1000.00'
# Print the match result
str.scan(re) do |match|
puts match.to_s
end
对于您的测试,您可能不需要多行标志,并且可以安全地删除m
。
此代码段表明我们可能有一个有效的表达式:
const regex = /([0-9]+\.[0-9]+)/gm;
const str = `1
1000
1.00
1000.00`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
如果这不是您想要的表达式,则可以在regex101.com中修改/更改表达式。
您还可以在jex.im中可视化您的表达式:
此脚本针对表达式返回浮点数的运行时间。
const repeat = 1000000;
const start = Date.now();
for (var i = repeat; i >= 0; i--) {
const regex = /([0-9]+\.[0-9]+)/gm;
const str = `1000.00`;
const subst = `$1`;
var match = str.replace(regex, subst);
}
const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ");