Como remover todos os zeros à esquerda em uma string


163

Se eu tiver uma string

00020300504
00000234892839
000239074

como posso me livrar dos zeros à esquerda para ter apenas isso

20300504
234892839
239074

note que o número acima foi gerado aleatoriamente.


Essas três seqüências são separadas ou uma sequência com novas linhas separando cada número? Percebi ao editar sua pergunta que você tinha <br>tags separando os números; eles realmente fazem parte da sua string?
erisco 23/02

Respostas:


458

ltrim:

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

2
Advertência $ str: = '0'. Abordado na minha resposta, com base nesta resposta.
Mike Weir

por que complicar demais as coisas? e mike é $ str + = 0; como explicado aqui: nabtron.com/kiss-code
Nabeel Khan

@ NabeelKhan Isso não responderia à pergunta, que não pede para converter a string em um número inteiro. Veja os comentários na resposta do Svisstack para saber por que essa não é uma solução tão boa.
Loneomeday

@lonesomeday, você deve ler a pergunta com atenção, onde ele menciona: "observe que o número acima foi gerado aleatoriamente". Então, eles estão inteiros já :)
Nabeel Khan

1
Cuidado: Isso transformará '0' em ''
Goose

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

Eu apenas tentei um (int) "00009384783473"(número aleatório) e meu resultado foi 2147483647. Se eu o converter como flutuador, no entanto, ele parece funcionar bem. Strange
JamesHalsall,

O manual diz que "o tamanho de um número inteiro depende da plataforma, embora um valor máximo de cerca de dois bilhões seja o valor usual (são assinados 32 bits)"
llamerr

1
Não é estranho. Os números inteiros em php vão até 2 ^ 31, que é 2147483647. Para números maiores, você terá que usar a solução baseada em string de um dia de solitário.
awm 23/02

1
A conversão para flutuar pode parecer funcionar, mas em algum momento você receberá erros de arredondamento.
awm 23/02

1
que tal a idéia de avaliar cada uma das cadeias usando uma instrução loop, que quando chegar a um dígito (ou cadeia) diferente de zero, obterá o índice desse dígito e eliminará todos os zeros anteriores e ecoará a cadeia que inicia com o primeiro valor diferente de zero ..
Gerald

10

Não sei por que as pessoas estão usando métodos tão complexos para conseguir uma coisa tão simples! E regex? Uau!

Aqui está, a maneira mais fácil e simples (como explicado aqui: https://nabtron.com/kiss-code/ ):

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

echo $a; // will output 1

2
Parece uma solução mais simples, mas não lida com nenhum tamanho de string, como outras respostas. Você está convertendo de uma sequência para um número inteiro e depois volta como uma sequência - mais simples para encurtar a sequência.
Mike Weir

1
Interessante, mas não sei se é a melhor solução com as conversões de tipo.
jonathanbell

1
Por favor, não faça isso ... é por isso que o PHP recebe uma má reputação
Dan F.

9

Semelhante a outra sugestão, exceto que não obliterará o zero real:

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

Ou, como foi sugerido (no PHP 5.3), o operador ternário abreviado pode ser usado:

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

1
$str = ltrim($str, '0') ?: '0'; - sem chamada redundante.
mickmackusa 26/06

8

você pode adicionar "+" na sua variável,

exemplo:

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

3

O Regex já foi proposto, mas não corretamente:

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

saída é então:

4523423400023402340240

Antecedentes do Regex: o ^início dos sinais da string e o +sinal indicam mais ou nenhum sinal anterior. Portanto, a regex ^0+corresponde a todos os zeros no início de uma sequência.


preg_replace() expects at least 3 parameters, 2 given
precisa saber é o seguinte

2

Eu não acho que preg_replace é a resposta .. thread antigo, mas apenas por procurar isso hoje. ltrim e (int) casting são os vencedores.

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

Se você adicionar o operador ^ no início da regex, é uma solução válida.
twicejr

0

Estou corrigido dessa maneira.

é muito simples. somente passe uma string e remova o início zero da string.

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

-1

Ajay Kumar oferece o eco mais simples + $ numString; Eu uso estes:

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

Na verdade, qualquer função matemática pega o número da "string" e o trata assim. É muito mais simples do que qualquer função regular ou comparativa. Vi isso no php.net, não lembro onde.


-2

Supondo que você queira remover um ou mais zeros e que seu exemplo seja uma sequência:

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

Você pode fazer com que o padrão regex se adapte ao que você precisa, se minhas suposições estiverem desativadas.

Isso ajuda?


1
Incorreto, desculpe. Isso também cortará o '000' do meio da corda.
Filip OvertoneSinger Rydlo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.