web-dev-qa-db-ja.com

正の数の前にプラス記号を付ける方法PHP

負の数を変更せずに返す関数を設計する必要がありますが、数値がまだ存在しない場合は、数値の先頭に+記号を追加する必要があります。

例:

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

数値入力のみを取得します。

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

この関数はecho/printで数回呼び出されるため、速いほど良いです。

更新:

答えてくれてありがとう。 sprintfベースのソリューションは本当に速いと言わなければなりません。

23
user318466

正規表現は次のように使用できます。

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

しかし、私はそのような些細なことにregexを使用しないnotを提案します。 sprintf ここで次のように使用することをお勧めします。

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

から sprintfのPHPマニュアル

数値に記号(-または+)を強制的に使用するオプションの記号指定子。デフォルトでは、負の数の場合、-記号のみが数値に使用されます。 この指定子は、正の数にも+記号を付けるように強制し、PHP 4.3.0に追加されました。

64
codaddict
function formatNum($num) {
   return ($num>0)?'+'.$num:$num;
}
7
Dal Hundal
function formatNum($num) {
  $num = (int) $num; // or (float) if you'd rather
  return (($num >= 0) ? '+' : '') . $num; // implicit cast back to string
}
2
pinkgothic

簡単な解決策は、printf()関数でフォーマット指定子を利用することです。

例えば、

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

出力を与えます

+2
-2

あなたの場合

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

@unicornaddictが提供するsprintfソリューションは非常に優れており、おそらく最もエレガントな方法です。とにかく私が代替案を提供すると思っただけです。彼らがどのように速度を測定するかわからない。

// 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
nikc.org