Cómo eliminar todos los ceros a la izquierda en una cadena


163

Si tengo una cuerda

00020300504
00000234892839
000239074

¿Cómo puedo deshacerme de los ceros a la izquierda para que solo tenga esto?

20300504
234892839
239074

Tenga en cuenta que el número anterior se generó al azar.


¿Son estas tres cadenas separadas, o una cadena con líneas nuevas que separan cada número? Al editar su pregunta, noté que tenía <br>etiquetas que separaban los números; ¿son realmente parte de tu cadena?
erisco

Respuestas:


458

ltrim:

$str = ltrim($str, '0');

2
Advertencia $ str: = '0'. Abordado en mi respuesta, basado en esta respuesta.
Mike Weir

¿Por qué complicar demasiado las cosas? y Mike es $ str + = 0; como se explica aquí: nabtron.com/kiss-code
Nabeel Khan

@NabeelKhan Eso no respondería la pregunta, que no pide convertir la cadena a un entero. Vea los comentarios sobre la respuesta de Svisstack de por qué esta no es una solución tan buena.
solitario el

@lonesomeday deberías leer su pregunta cuidadosamente donde menciona: "ten en cuenta que el número anterior se generó al azar". así que ya son enteros :)
Nabeel Khan

1
Precaución: Esto convertirá '0' en ''
Goose

12
(string)((int)"00000234892839")

Acabo de probar un (int) "00009384783473"(número aleatorio) y mi resultado fue 2147483647. Sin embargo, si lo lanzo como flotante, parece funcionar bien. Extraño
JamesHalsall

El manual dice que "el tamaño de un número entero depende de la plataforma, aunque un valor máximo de aproximadamente dos mil millones es el valor habitual (son 32 bits con signo)"
llamerr

1
No es extraño. Los enteros en php van hasta 2 ^ 31, que es 2147483647. Para cualquier número mayor, deberá usar la solución basada en cadenas de lonesomeday.
awm

1
Puede parecer que el lanzamiento a flotación funciona, pero en algún momento obtendrá errores de redondeo.
awm

1
¿qué tal la idea de evaluar cada una de las cadenas usando una declaración de bucle, que cuando llega a un dígito (o cadena) distinto de cero, obtendrá el índice de ese dígito y eliminará todos los ceros anteriores y luego hará eco de la cadena que comienza con el primer valor distinto de cero ..
Gerald

10

¡No sé por qué la gente usa métodos tan complejos para lograr algo tan simple! Y regex? ¡Guauu!

Aquí tienes, la forma más fácil y sencilla (como se explica aquí: https://nabtron.com/kiss-code/ ):

$a = '000000000000001';
$a += 0;

echo $a; // will output 1

2
Esto parece una solución más simple, pero no maneja ningún tamaño de cadena como lo hacen otras respuestas. Estás convirtiendo de una cadena a un número entero y luego de vuelta como una cadena, más simple simplemente acortar la cadena.
Mike Weir

1
Interesante, pero no sé si es la mejor solución con las conversiones de tipo.
jonathanbell

1
Por favor, no hagas esto ... esta es la razón por la cual PHP tiene una mala reputación
Dan F.

9

Similar a otra sugerencia, excepto que no borrará el cero real:

if (ltrim($str, '0') != '') {
    $str = ltrim($str, '0');
} else {
    $str = '0';
}

O como se sugirió (a partir de PHP 5.3), se puede usar el operador ternario abreviado:

$str = ltrim($str, '0') ?: '0'; 

1
$str = ltrim($str, '0') ?: '0'; - sin llamada de recorte redundante.
mickmackusa

8

puedes agregar "+" en tu variable,

ejemplo:

$numString = "0000001123000";
echo +$numString;

3

Regex ya se propuso, pero no correctamente:

<?php
    $number = '00000004523423400023402340240';
    $withoutLeadingZeroes = preg_replace('/^0+/', '', $number)
    echo $withoutLeadingZeroes;
?>

la salida es entonces:

4523423400023402340240

Antecedentes de Regex: las ^señales comienzan con una cadena y el +signo señala más o nada del signo anterior. Por lo tanto, la expresión regular ^0+coincide con todos los ceros al comienzo de una cadena.


preg_replace() expects at least 3 parameters, 2 given
TarangP

2

No creo que preg_replace sea la respuesta ... hilo viejo pero resulta que busco esto hoy. Itrim y (int) casting es el ganador.

<?php
 $numString = "0000001123000";
 $actualInt = "1123000";

 $fixed_str1 = preg_replace('/000+/','',$numString);
 $fixed_str2 = ltrim($numString, '0');
 $fixed_str3 = (int)$numString;

 echo $numString . " Original";
 echo "<br>"; 
 echo $fixed_str1 . " Fix1";
 echo "<br>"; 
 echo $fixed_str2 . " Fix2";
 echo "<br>";
 echo $fixed_str3 . " Fix3";
 echo "<br>";
 echo $actualInt . " Actual integer in string";

 //output

 0000001123000 Origina
 1123 Fix1
 1123000 Fix2
 1123000 Fix3
 1123000 Actual integer in tring

Si agrega el operador ^ al comienzo de la expresión regular, es una solución válida.
veces

0

Estoy arreglado de esta manera.

es muy simple. solo pasa una cadena para eliminar el inicio cero de la cadena.

function removeZeroString($str='')
{
    while(trim(substr($str,0,1)) === '0')
    {
        $str = ltrim($str,'0');
    }
    return $str;
}

-1

Ajay Kumar ofrece el echo más simple + $ numString; Yo uso estos:

echo round($val = "0005");
echo $val = 0005;
    //both output 5
echo round($val = 00000648370000075845);
echo round($val = "00000648370000075845");
    //output 648370000075845, no need to care about the other zeroes in the number
    //like with regex or comparative functions. Works w/wo single/double quotes

En realidad, cualquier función matemática tomará el número de la "cadena" y lo tratará así. Es mucho más simple que cualquier expresión regular o funciones comparativas. Vi eso en php.net, no recuerdo dónde.


-2

Suponiendo que desea eliminar una secuencia de tres o más ceros y su ejemplo es una cadena:

    $test_str ="0002030050400000234892839000239074";
    $fixed_str = preg_replace('/000+/','',$test_str);

Puede hacer que el patrón regex se ajuste a lo que necesita si mis suposiciones están apagadas.

Esta ayuda?


1
Incorrecto, lo siento. Esto también cortará el '000' del centro de la cadena.
Filip OvertoneSinger Rydlo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.