문자열에서 모든 선행 0을 제거하는 방법


163

끈이 있으면

00020300504
00000234892839
000239074

내가 이것을 갖도록 선행 0을 어떻게 제거 할 수 있습니까?

20300504
234892839
239074

위의 숫자는 무작위로 생성되었습니다.


이 세 개의 개별 문자열입니까, 또는 각 숫자를 구분하는 줄 바꿈이있는 하나의 문자열입니까? 질문을 편집 할 때 <br>숫자를 구분하는 태그 가 있음을 알았습니다 . 그들은 실제로 문자열의 일부입니까?
erisco

답변:


458

ltrim:

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

2
경고 $ str : = '0'. 이 답변을 바탕으로 내 답변에서 해결되었습니다.
Mike Weir

왜 지나치게 복잡한가? 마이크는 $ str + = 0입니다. 등이 여기에 설명 : nabtron.com/kiss-code
나빌 칸

@NabeelKhan 그것은 질문에 대답하지 않을 것이며, 문자열을 정수로 변환하도록 요청 하지 않습니다 . 이것이 왜 그렇게 훌륭한 솔루션이 아닌지 Svisstack의 답변에 대한 의견을 참조하십시오.
lonesomeday

@lonesomeday는 자신의 질문을주의 깊게 읽어야합니다. "위의 숫자는 무작위로 생성되었습니다." 그래서 그들은 이미 정수입니다 :)
Nabeel Khan

1
주의 : 이것은 '0'을 ''
Goose

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

방금 (int) "00009384783473"(랜덤 번호)를 시도했는데 결과는 2147483647입니다. 그러나 부동 소수점으로 캐스팅하면 정상적으로 작동하는 것 같습니다. 이상
JamesHalsall

매뉴얼에 따르면 "정수의 크기는 플랫폼에 따라 다르지만 최대 약 20 억 개의 값이 일반적인 값 (32 비트 부호)입니다"
llamerr

1
이상하지 않습니다. PHP의 정수는 2147483647 인 2 ^ 31까지 올라갑니다. 더 큰 숫자에는 lonesomeday의 문자열 기반 솔루션을 사용해야합니다.
awm

1
플로팅 캐스팅이 작동하는 것처럼 보이지만 어느 시점에서 반올림 오류가 발생합니다.
awm

1
루프 문을 사용하여 각 문자열을 평가하는 아이디어는 어떻습니까? 0이 아닌 숫자 (또는 문자열)에 도달하면 해당 숫자의 색인을 가져오고 앞의 0을 모두 삭제 한 다음 시작하는 문자열을 에코합니다 첫 번째 0이 아닌 값으로 ..
Gerald

10

사람들이 왜 그렇게 단순한 것을 달성하기 위해 그렇게 복잡한 방법을 사용하는지 모르십시오! 그리고 정규식? 와!

가장 쉽고 간단한 방법입니다 ( https://nabtron.com/kiss-code/ 참조 ).

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

echo $a; // will output 1

2
이것은 더 간단한 솔루션처럼 보이지만 다른 답변과 같이 문자열의 크기를 처리하지 않습니다. 문자열에서 정수로 변환 한 다음 다시 문자열로 변환하면 문자열이 짧아지기 쉽습니다.
Mike Weir

1
흥미롭지 만 유형 변환에 가장 적합한 솔루션인지는 모르겠습니다.
jonathanbell

1
제발 이러지 말아라 ... PHP가 나쁜 평판을 얻는 이유
Dan F.

9

실제 제로를 없애지 않는 것을 제외하고 다른 제안과 비슷합니다.

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

또는 제안 된대로 (PHP 5.3에서) 속기 삼항 연산자를 사용할 수 있습니다.

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

1
$str = ltrim($str, '0') ?: '0'; -중복 트림 호출이 없습니다.
mickmackusa

8

변수에 "+"를 추가하면

예 :

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

3

정규식은 이미 제안되었지만 올바르게 올바르지 않습니다.

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

출력은 다음과 같습니다.

4523423400023402340240

정규식에 대한 배경 : ^문자열의 시작 신호와 +부호는 앞 부호의 부호를 나타내거나 전혀 나타내지 않습니다. 따라서 정규 표현식 ^0+은 문자열 시작 부분의 모든 0과 일치합니다.


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

2

나는 preg_replace가 답이라고 생각하지 않습니다. 오래된 스레드이지만 오늘 이것을 찾는 것입니다. ltrim 및 (int) 캐스팅이 승자입니다.

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

정규식 시작 부분에 ^ 연산자를 추가하면 유효한 솔루션입니다.
twicejr 2012

0

이 방법으로 고정되었습니다.

매우 간단합니다. 문자열의 0 시작을 제거하는 문자열 만 전달하십시오.

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

-1

Ajay Kumar는 가장 간단한 반향 + $ numString을 제공합니다 . 나는 이것을 사용한다 :

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

실제로 모든 수학 함수는 "문자열"에서 숫자를 가져 와서 처리합니다. 정규식이나 비교 함수보다 훨씬 간단합니다. 나는 php.net에서 그것을 어디에 있는지 기억하지 못한다.


-2

세 개 이상의 0을 제거하고 예제가 하나의 문자열이라고 가정합니다.

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

내 가정이 꺼져 있으면 정규식 패턴을 필요한 것에 맞출 수 있습니다.

도움이 되셨습니까?


1
죄송합니다. 죄송합니다. 또한 문자열 중간에서 '000'을 자릅니다.
Filip OvertoneSinger Rydlo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.