我需要削减一些数字:
21250000.022000 -> 21250000.022
20.00 -> 20
200 -> 200
20.50 -> 20.5
更新
这是我尝试的: https://regex101.com/r/Sdfe5D/1 在这个正则表达式中,问题在于numnbers' 200'和' 20'。
答案 0 :(得分:6)
你不需要正则表达式。只需将字符串转换为double
:
$arr = array('21250000.022000', '20.00', '200', '20.50');
foreach ($arr as $n)
echo (double) $n. "\n";
<强>输出:强>
21250000.022
20
200
20.5
更新:如果您正在寻找正则表达式解决方案,请使用:
搜索正则表达式:
(?:(\.\d*?[1-9]+)|\.)0*$
替换:
$1
答案 1 :(得分:3)
这个正则表达式具有更好的性能:
\.0+$|(\.\d*[1-9])(0+)$
替换为$1
首先,我们处理任何整数,因为它们更容易:
\.0+$
然后,我们匹配捕获组中小数点后面的重要数字(我们要保留):
(\.\d*[1-9])
最后,我们匹配所有跟踪零和字符串的结尾(如果需要,用$替换$)
(0+)$
答案 2 :(得分:2)
您可以使用以下正则表达式。我使用了积极的预测来仅选择相关的数字:(?=)
^[^\.]+?(?=\.0*$)|^[^\.]+?\..*?(?=0*$)|^[^\.]*$
^[^\.]+?(?=\.0*$)
:第一部分查找的数字不是点([^\.]
),后跟一个点和一个随机数的零,一直持续到结束({{1 }})。这与$
或20.000 -> 20
等数字相匹配。它不会匹配线末端的任何点。25.0 -> 25
:第二部分看起来非常相似。它查找的数字不是点,后跟点,任何字符和尾随零。区别在于正向前瞻的括号中:这意味着它也匹配点(^[^\.]+?\..*?(?=0*$)
)之后的字符,但前提是它们是非尾随零。仅此正则表达式将匹配\.
。此处匹配项的示例为20.0 -> 20.
或20.04020000 -> 20.0402
24.120300 -> 24.1203
:匹配整数而不包含任何点。对于像200或21这样的数字,这个是必需的。 此正则表达式基于开头(^[^\.]*$
)和字符串结尾(^
)。它不会匹配一个字符串中的多个数字。在一个字符串中使用多个数字时,需要使用换行符来匹配数字。
您可以使用以下代码段测试正则表达式:
$
&#13;
答案 3 :(得分:1)
如果你真的需要使用正则表达式,那么以下是一种方式:
preg_replace("/(\.[0-9]*[1-9]+)[0]+/", "$1", "21250000.022000");
但是,只需将字符串转换为double即可删除尾随零:
(double) "21250000.022000";