2010-04-21 1 views
18

Ich muss eine Funktion entwerfen, um negative Zahlen unverändert zurückzugeben, aber sollte ein + Zeichen am Anfang der Zahl hinzufügen, wenn es bereits nicht vorhanden ist.Wie man eine positive Zahl mit Pluszeichen in PHP voranstellt

Beispiel:

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

Es wird nur numerische Eingabe erhalten.

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

Diese Funktion ist in echo/print so desto besser mehrmals aufgerufen werden wird, desto schneller.

Update:

Sie alle für die Antworten danken. Ich muss sagen, die sprintf basierte Lösung ist wirklich schnell.

+1

Was bedeutet "+ ve" und "-ve" bedeuten? –

+0

Joachim, tut mir leid, ich wusste nicht, dass das nicht standardmäßige kurze Darstellungen sind. – user318466

Antwort

53

können Sie verwenden regex als:

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

Aber ich würde nicht mit regex für eine solche triviale Sache vor. Es ist besser zu nutzen sprintf hier:

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

Von PHP Manual for sprintf:

Ein optionales Vorzeichen Spezifizierer, das ein Zeichen zwingt (- oder +) auf einer Reihe verwendet werden. Standardmäßig wird nur das -Zeichen für eine Zahl verwendet, wenn sie negativ ist. Dieser Spezifizierer erzwingt, dass positive Zahlen mit dem + -Zeichen verknüpft werden, und wurde in PHP 4.3.0 hinzugefügt.

+7

+1 für 'sprintf' (ich fragte mich, warum niemand das von Anfang an vorgeschlagen hat;) aber dann warst du schneller als ich :-D) –

+1

+1 für sprintf auch –

+0

einhornaddikt: warum nicht regex verwenden? Ich habe gehört, dass sie mächtig sind. Sind sie nicht? – user318466

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

Wenn ich +1 übergebe, gibt es ++ 1 zurück :( – user318466

+0

Dann in int. –

+0

übergeben, wenn Sie es +1 übergeben, gibt es +1 zurück. Es gibt ++ 1 zurück, wenn Sie es +1 als Zeichenfolge übergeben haben Trotzdem bevorzuge ich die sprintf-Methode von UnicornAddict. –

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

Die sprintf Lösung von @unicornaddict vorgesehen ist sehr schön und wahrscheinlich der eleganteste Weg zu gehen. Ich dachte nur, ich würde sowieso eine Alternative anbieten. Nicht sicher, wie sie in der Geschwindigkeit messen.

// 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)); 
} 
+0

Oder: Statt 'intval()', nur 'return (((string) abs ($ num)) === $ num) ? '+'. $ num: $ num; '- obwohl das vielleicht nur für Ganzzahlen zuverlässig funktioniert? [Ich halte paranoid, gosh.] – pinkgothic

+0

Das Problem ist nicht im Vergleichsteil, sondern eher im Retourteil Aber wie du bereits erwähnt hast, funktioniert es nur für Integer. Modifizieren, um auch für Floats zu arbeiten, wäre trivial, könnte aber nur demonstrieren, warum 'sprintf' eine bessere Wahl ist. –

+0

Einverstanden über' sprintf'! Ich bin nicht sicher, es wäre trivial, es zu modifizieren, um mit Schwimmern zu arbeiten, thou gh, die Zeichenkette könnte nicht ein float darstellen, das gespeichert werden kann, na ja, float, und dann würde das Gießen von float zurück zu string einen Unterschied ergeben, wo es keinen gibt? – pinkgothic

1

Die einfache Lösung besteht darin, den Formatbezeichner in der Funktion printf() zu verwenden.

Zum Beispiel

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

gibt den Ausgang

+2 
-2 

In Ihrem Fall

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