regex 如何在PHP中使用加号前缀正数

lb3vh1jj  于 2023-03-04  发布在  PHP
关注(0)|答案(7)|浏览(152)

我需要设计一个函数,返回负数不变,但应添加一个+符号在数字的开始,如果它已经没有了。
示例:

Input     Output
----------------
+1         +1
1          +1
-1         -1

它将只获得数字输入。

function formatNum($num)
{
# something here..perhaps a regex?
}

这个函数将在echo/print中被调用几次,所以越快越好。

uz75evzq

uz75evzq1#

您可以将regex用作:

function formatNum($num){
    return preg_replace('/^(\d+)$/',"+$1",$num);
}

但是我建议不要使用regex来做这样一件小事,最好在这里使用sprintf

function formatNum($num){
    return sprintf("%+d",$num);
}

PHP Manual for sprintf开始:
一个可选的符号说明符,强制在数字上使用符号(-或+)。默认情况下,只有当数字是负数时,才会使用-符号。这个说明符强制正数也要附加+符号,它是在PHP 4.3.0中添加的。

zpqajqem

zpqajqem2#

function formatNum($num) {
   return ((float) $num>0)?'+'.$num:$num;
}
5ktev3wc

5ktev3wc3#

function formatNum($num) {
  $num = (int) $num; // or (float) if you'd rather
  return (($num >= 0) ? '+' : '') . $num; // implicit cast back to string
}
mwngjboj

mwngjboj4#

简单的解决方案是在printf()函数中使用格式说明符。
例如,

$num1=2;
$num2=-2;
printf("%+d",$num1);
echo '<br>';
printf("%+d",$num2);

给出输出

+2
-2

就你而言

function formatNum($num){
    return printf("%+d",$num);
 }
mu0hgdu0

mu0hgdu05#

试试这个:

$fmt = new NumberFormatter('es_ES', NumberFormatter::DECIMAL);
$fmt->setTextAttribute(NumberFormatter::POSITIVE_PREFIX, '+');
$result = $fmt->format(10000);

结果将为:+10.000
完全符合NumberFormatter::POSITIVE_SUFFIX,您将收到10.000+

szqfcxe2

szqfcxe26#

sprintf解决方案由@ unicornaddicate提供,非常好,可能是最优雅的方式去。只是觉得我会提供一个替代品,无论如何。不知道他们如何衡量速度。

// Non float safe version
function formatNum($num) {
    return (abs($num) == $num ? '+' : '') . intval($num);
}

// Float safe version
function formatNum($num) {
    return 
        (abs($num) == $num ? '+' : '') 
        . (intval($num) == $num ? intval($num) : floatval($num));
}

// Float safe version, alternative
function formatNum($num) {
    return 
        (abs($num) == $num ? '+' : '') 
        // Add '1' to $num to implicitly cast it to a number
        . (is_float($num + 1) ? floatval($num) : intval($num));
}
jbose2ul

jbose2ul7#

好吧,这是相当旧,可能没有用,但我认为仍然有一些空间,稍微增加,如果你有数字“准备好”:

if($num>=0) $num='+'.(0+$num);

或者,如果您确定它是一个数字:

if($num>=0) $num='+'.$num;
  • 这对负数没有任何作用,如果是正数,则将其更改为字符串。
  • 如果不是,则添加0会转换为Number,并且不会更改数值类型,如强制转换为(float)或(int)。如果您确定它是一个数字,则添加0是无用的,请使用第二个版本。
  • 这可能是最快的方法
  • 缺点是,结果中有一半是字符串,一半是数字(sprintf会使它们都是字符串)

相关问题