文字列内のすべての先行ゼロを削除する方法


163

文字列がある場合

00020300504
00000234892839
000239074

先頭のゼロを削除して、これだけにする方法

20300504
234892839
239074

上記の数値はランダムに生成されたものです。


これらの3つの個別の文字列ですか、それとも各数値を改行で区切った1つの文字列ですか?質問を編集しているときに<br>、番号を区切るタグがあることに気付きました。それらは実際に文字列の一部ですか?
erisco

回答:


458

ltrim

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

2
警告$ str:= '0'。この回答に基づいて、私の回答で対処しました。
Mike Weir

なぜ複雑すぎるのですか?マイクは$ str + = 0です。ここで説明するように:nabtron.com/kiss-code
Nabeel Khan

@NabeelKhanこれは、文字列を整数に変換することを求めない質問には答えませ。これがそれほど優れたソリューションではない理由については、Svisstackの回答に関するコメントを参照してください。
lonesomeday

@lonesomedayあなたは彼が言及する場所で彼の質問を注意深く読むべきです:「上の数値はランダムに生成されたことに注意してください。」したがって、これらはすでに整数です:)
Nabeel Khan

1
注意:これは「」に「0」になります
グース

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

(int) "00009384783473"(乱数)を試したところ、結果は2147483647でした。ただし、フロートとしてキャストした場合は、問題なく動作するようです。ストレンジ
JamesHalsall

マニュアルには、「整数のサイズはプラットフォームに依存しますが、最大値は約20億が通常の値です(32ビットの符号付きです)」
llamerr

1
変ではない。PHPの整数は2 ^ 31、つまり2147483647になります。これより大きな数の場合は、lonesomedayの文字列ベースのソリューションを使用する必要があります。
awm

1
floatへのキャストは機能するように見えるかもしれませんが、ある時点で丸めエラーが発生します。
awm

1
ループステートメントを使用して各文字列を評価するという考えはどうですか。ゼロ以外の数字(または文字列)に到達すると、その数字のインデックスを取得し、先行するすべてのゼロを削除してから、開始する文字列をエコーし​​ます。最初のゼロ以外の値で..
ジェラルド

10

人々がなぜそんなに単純なことを達成するためにそれほど複雑な方法を使用しているのかわからない!そして正規表現?うわー!

ここで、最も簡単で簡単な方法を説明します(ここで説明されているように:https : //nabtron.com/kiss-code/):

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

echo $a; // will output 1

2
これはより簡単な解決策のようですが、他の回答のように任意のサイズの文字列を処理しません。あなたは文字列から整数に変換してから文字列に戻します-文字列を単に短くする方が簡単です。
Mike Weir

1
興味深いですが、それが型変換の最善の解決策かどうかはわかりません。
ジョナサンベル2017年

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


3

正規表現はすでに提案されていますが、正しくありません:

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

出力は次のとおりです。

4523423400023402340240

正規表現の背景:^文字列の先頭の信号と+記号は、先行する記号のほとんどまたはまったくを示します。したがって、正規表現^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

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

3つ以上のゼロの実行を削除して、例が1つの文字列であると仮定します。

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

私の仮定が外れている場合、正規表現パターンを必要なものに合わせることができます。

この助け?


1
不正解です。ごめんなさい。これにより、ストリングの中央から「000」もカットされます。
Filip OvertoneSinger Rydlo 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.