0

我正在尝试从包含用于表示百分比的数值的字符串中修剪前导零和尾随零。

我编写了这段丑陋的代码块,它结合了 rtrim()、ltrim() 和 preg_replace():

rtrim(ltrim(preg_replace("/\d*\.(0(?![0$])|[1-9])*\K0+$/", "", $value),"0"), ".")

但它似乎不起作用,因为如果我输入 0010.003000 输出是 10.003000 而不是所需的 10.003

有没有办法让正则表达式在 Php 中从右到左读取(从右侧删除零,直到找到零或 [1-9])?或者有没有办法改进我的正则表达式来实现我的目标?

重要提示:出于某种可争论的原因,我不能做一个简单的演员来漂浮并简单地享受玩电子游戏所节省的时间。

为了更好地解释我的奇怪问题,这里有一些具有预期行为的示例: 01.00 => 1 , 100 => 100 , 002.0050 => 2.005 , 0.005 => .005

4

5 回答 5

2

尝试以下操作:

/^0+|\..+?\K0+$/g

这要么匹配0start-of-string 的一个或多个s ,要么匹配 end-of-string 的^0+一个或多个s 。00+$

在 PHP 中:

preg_replace_all("/^0+|\..+?\K0+$/", "", $value)

注意:我建议使用非正则表达式解决方案,因为它们更适合这种简单的情况。尽管如此,我还是发布了这个,因为您要求使用正则表达式。

正则表达式 101 演示

于 2013-11-07T22:38:42.800 回答
0

只需您的字符串转换为float

$s = '0010.003000';
echo (float) $s;
//=> 10.003
于 2013-11-07T22:38:49.100 回答
0

您可以使用floatval而不是正则表达式:

<?php
$str = "0010.003000";
print floatval($str);

输出:10.003

于 2013-11-07T22:39:02.460 回答
0

你对这样的正则表达式有什么看法?

echo preg_replace("/((^0+)|(0+$))/", "", $value);

好的,现在我明白了这个问题;)试试这个:

echo preg_replace("/^0*([1-9][0-9]*(\.[0-9]*[1-9]))?0*$/", "$1", $value);
于 2013-11-07T22:40:48.697 回答
0

为了回答您的奇怪问题,我添加了对0.000返回的支持0

$nbr = preg_replace('/^(0)+\.?0*$|^0+|\.0*$|\.\d+?\K0+$/', '$1', $nbr);
于 2013-11-08T00:56:09.670 回答