假设我们有两个价格字符串,格式不同:
$s_price = '85.95' or '1500.00'
$r_price = '$ 85.95' or '1,500'
但是所有这些价格都是相同的,应该匹配。
我有一个正则表达式可以执行此操作,但不知道这是否是我们的操作方式:
(\d+)*(,)?\d+(.)?\d*
答案 0 :(得分:3)
要从PHP字符串中检索和解析浮点数,请使用floatval()
方法。
对于符号,取决于您是否始终对货币使用相同的约定(逗号表示千位分隔符,点表示小数位)。在这种情况下,您应该使用preg_replace()
方法(点正则表达式可以为/[^0-9.]/
)除去点以外的非数字
<?php
function sanitize($price) {
return floatval(preg_replace('/[^0-9.]/', '', $price));
}
$a1 = '85.95';
$a2 = '1500.00';
$b1 = '$ 85.95';
$b2 = '1,500';
sanitize($a1); // (float) 85.95
sanitize($a2); // (float) 1500
sanitize($b1); // (float) 85.95
sanitize($b2); // (float) 1500
sanitize($a1) === sanitize($b1); // (bool) true
sanitize($a2) === sanitize($b2); // (bool) true
sanitize($a1) <= sanitize($a2); // (bool) true
sanitize($b1) >= sanitize($b2); // (bool) false
希望这会有所帮助!
答案 1 :(得分:0)
使用?
和*
的模式中有很多可选部分,如果您不在代码中引用捕获组,则可以省略捕获组。
您可能要做的是匹配一个美元符号的可选部分,后跟0+个水平空格字符。
然后匹配1+位数字,后跟可选部分以匹配点或逗号和1+位数字
(?<!\S)(?:\$\h*)?\d+(?:[,.]\d+)\b
说明
(?<!\S)
声明左侧的内容不是非空白字符(?:\$\h*)?
(可选)匹配一个美元符号和0+个水平空格字符\d+(?:[,.]\d+)
匹配1位以上的数字,后跟可选部分以匹配点或逗号和1位以上的数字\b
单词边界,以防止数字成为大单词的一部分答案 2 :(得分:-3)
您将数字存储为整数或浮点数
并进行比较,您需要使用||不是还是
希望有帮助