正则表达式,用于验证浮点数

时间:2019-05-19 16:12:17

标签: regex ruby string regex-group

我正在上课的抵押贷款计算器。我有一种方法来确定该值是否为浮点数,同上有效数字,同上整数。如果该号码是有效号码

我尝试使用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

我希望任何不包含小数的内容对于浮点数都是假的?方法,但是如果我不输入小数点,则我的程序似乎不在乎。

2 个答案:

答案 0 :(得分:0)

简单而强大的方法是完全不使用正则表达式。为什么要关心字符串的外观?您真正关心的是Ruby是否可以真正将该字符串转换转换为int / float。为此,请使用内置的IntegerFloat方法:

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

JavaScript演示

此代码段表明我们可能有一个有效的表达式:

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}`);
    });
}

RegEx

如果这不是您想要的表达式,则可以在regex101.com中修改/更改表达式。

enter image description here

RegEx电路

您还可以在jex.im中可视化您的表达式:

enter image description here

性能测试

此脚本针对表达式返回浮点数的运行时间。

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.  ");