正则表达式用于删除小数点后不必要的零

时间:2017-01-03 19:08:25

标签: regex

我需要削减一些数字:

21250000.022000 -> 21250000.022
20.00  -> 20
200 -> 200
20.50 -> 20.5

更新

这是我尝试的: https://regex101.com/r/Sdfe5D/1 在这个正则表达式中,问题在于numnbers' 200'和' 20'。

4 个答案:

答案 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

Code Demo

更新:如果您正在寻找正则表达式解决方案,请使用:

搜索正则表达式:

(?:(\.\d*?[1-9]+)|\.)0*$

替换:

$1

RegEx Demo

答案 1 :(得分:3)

这个正则表达式具有更好的性能:

\.0+$|(\.\d*[1-9])(0+)$

替换为$1

如果您有兴趣,可以在这里解释一下:

首先,我们处理任何整数,因为它们更容易:

\.0+$

然后,我们匹配捕获组中小数点后面的重要数字(我们要保留):

(\.\d*[1-9])

最后,我们匹配所有跟踪零和字符串的结尾(如果需要,用$替换$)

(0+)$

See it live

答案 2 :(得分:2)

您可以使用以下正则表达式。我使用了积极的预测来仅选择相关的数字:(?=)

^[^\.]+?(?=\.0*$)|^[^\.]+?\..*?(?=0*$)|^[^\.]*$
  1. ^[^\.]+?(?=\.0*$):第一部分查找的数字不是点([^\.]),后跟一个点和一个随机数的零,一直持续到结束({{1 }})。这与$20.000 -> 20等数字相匹配。它不会匹配线末端的任何点。
  2. 25.0 -> 25:第二部分看起来非常相似。它查找的数字不是点,后跟点,任何字符和尾随零。区别在于正向前瞻的括号中:这意味着它也匹配点(^[^\.]+?\..*?(?=0*$))之后的字符,但前提是它们是非尾随零。仅此正则表达式将匹配\.。此处匹配项的示例为20.0 -> 20.20.04020000 -> 20.0402
  3. 24.120300 -> 24.1203:匹配整数而不包含任何点。对于像200或21这样的数字,这个是必需的。
  4. 此正则表达式基于开头(^[^\.]*$)和字符串结尾(^)。它不会匹配一个字符串中的多个数字。在一个字符串中使用多个数字时,需要使用换行符来匹配数字。

    您可以使用以下代码段测试正则表达式:

    &#13;
    &#13;
    $
    &#13;
    &#13;
    &#13;

答案 3 :(得分:1)

如果你真的需要使用正则表达式,那么以下是一种方式:

preg_replace("/(\.[0-9]*[1-9]+)[0]+/", "$1", "21250000.022000");

但是,只需将字符串转换为double即可删除尾随零:

(double) "21250000.022000";