Как префиксировать положительное число знаком плюс в PHP


Мне нужно разработать функцию для возврата отрицательных чисел без изменений, но следует добавить знак + в начале числа, если его уже нет.

Пример:

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

Он получит только числовой ввод.

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

Эта функция будет вызываться несколько раз в echo/print, так что чем быстрее, тем лучше.

Обновление:

Спасибо всем вам за ответы. Я должен сказать, что решение на основе sprintf действительно быстрое.

Author: user318466, 2010-04-21

5 answers

Вы можете использовать регулярное выражение как:

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

Но я бы предложил не использовать regex для такой тривиальной вещи. Лучше использовать sprintf здесь как:

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

Из Руководства по PHP для sprintf:

Необязательный спецификатор знака, который заставляет использовать знак (- или +) для числа. По умолчанию для числа используется только знак -, если оно отрицательное. Этот спецификатор заставляет положительные числа также иметь знак +, и был добавлено в PHP 4.3.0.

 57
Author: codaddict, 2010-04-21 11:36:26
function formatNum($num) {
   return ($num>0)?'+'.$num:$num;
}
 6
Author: Dal Hundal, 2010-04-21 11:25:30
function formatNum($num) {
  $num = (int) $num; // or (float) if you'd rather
  return (($num >= 0) ? '+' : '') . $num; // implicit cast back to string
}
 2
Author: pinkgothic, 2010-04-21 11:38:26

Решение sprintf, предоставленное @unicornaddict, очень хорошее и, вероятно, самое элегантное. Просто подумал, что я все равно предложу альтернативу. Не знаю, как они измеряют скорость.

// 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));
} 
 1
Author: nikc.org, 2010-04-22 04:38:39

Простое решение состоит в том, чтобы использовать спецификатор формата в функции printf().

Например,

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

Выдает результат

+2
-2

В вашем случае

 function formatNum($num){
    return printf("%+d",$num);
 }
 1
Author: rancho, 2017-07-02 11:57:59