2010-04-21 11 views
18

Necesito diseñar una función para devolver los números negativos sin cambios pero debería agregar un signo + al comienzo del número si ya no está presente.Cómo prefijar un número positivo con el signo más en PHP

Ejemplo:

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

Se obtendrá única entrada numérico.

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

Esta función va a ser llamado varias veces en echo/print por lo que el más rápido, mejor.

Actualización:

Gracias a todos por las respuestas. Debo decir que la solución basada en sprintf es realmente rápida.

+1

¿Qué significa "+ ve" y "-ve" significa? –

+0

Joachim, lo siento, no sabía que esas son representaciones cortas no estándar. – user318466

Respuesta

53

Puede utilizar expresiones regulares como:

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

pero sugeriría noregex utilizando para tal cosa trivial. Su mejor hacer uso de sprintf aquí como:

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

De PHP Manual for sprintf:

Un especificador de signo opcional que fuerza un signo (- o +) para ser utilizado en un número. Por defecto, solo el signo - se usa en un número si es negativo. Este especificador fuerza a los números positivos a tener también el signo + conectado, y se agregó en PHP 4.3.0.

+7

+1 para 'sprintf' (me pregunté por qué nadie sugirió esto desde el principio;) pero luego fuiste más rápido que yo :-D) –

+1

+1 para sprintf también –

+0

unicornaddict: ¿por qué no utilizar regex? He oído que son poderosos. ¿No lo son? – user318466

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

Si paso +1, devuelvo ++ 1 :( – user318466

+0

Luego lanzo a int. –

+0

si lo pasa +1, devuelve +1. Devuelve ++ 1, si lo pasó como '+1' como cadena Sin embargo, prefiero el método sprintf de UnicornAddict. –

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

La solución proporcionada por sprintf @unicornaddict es muy agradable y probablemente el más elegante camino a seguir. Solo pensé en proporcionar una alternativa de todos modos. No estoy seguro de cómo se miden en velocidad.

// 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

O bien: en lugar de 'intval()', simplemente 'return (((string) abs ($ num)) === $ num) ? '+'. $ num: $ num; '-aunque eso podría funcionar solo para enteros? [I corchete paranoico, Dios mío.] – pinkgothic

+0

El problema no está en la parte de comparación, sino en la parte de retorno. Editado en mi ejemplo , pero como mencionaste, solo funcionará para los enteros. La modificación para trabajar en carrozas también sería trivial, pero podría demostrar por qué 'sprintf' es una mejor opción para empezar. –

+0

Estoy de acuerdo con' sprintf'! Estoy no estoy seguro de que sería trivial modificarlo para que funcione con carrozas, tú gh, la cuerda podría no representar un flotador que pueda almacenarse como, bueno, flotar, después de todo, y luego volver a fundir desde el flotador a la cuerda produciría una diferencia donde no lo hay. – pinkgothic

1

La solución simple es hacer uso del especificador de formato en la función printf().

Por ejemplo,

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

da la salida

+2 
-2 

En su caso

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