2016.
06.
05
12:21:04
結論から書くと
1文字ずつに分割して最初以外を0に置き換えて再結合する
もしくは
1桁になるように割って小数点以下を切り捨てて元の桁に戻す
とすることで、できました。
それでは詳細を書いていきます。
諸般の事情により
・2→2
・23→20
・456→400
・7890→7000
のように、数値(自然数)の最上位桁以外を0にしたかったのです。
やり方はいろいろあるだろうけど、どうしようね(--?と
5分くらい考えたところ、以下の2通りのやり方を思いつきました。
1.1文字ずつに分割して最初以外を0に置き換えて再結合する
2.1桁になるように割って小数点以下を切り捨てて元の桁に戻す
せっかくなので、両方やってみましょう。
前提条件は
・「$indata」に元の数字(456とか)が入っている
・「$indata」の整合性チェック(数値チェックとか)は済んでいる
・「$outdata」に結果を入れる
です。
まずは「1文字ずつに分割して最初以外を0に置き換えて再結合する」からやります。
……(--)
できた!φ(--)
簡単に説明しておくと
の
で「$indata」を文字列として1文字ずつに分割しています。
「456」なら「4」と「5」と「6」に分けているわけです。
その結果をforeachで回すことによって、1文字ずつ処理しています。
あとはループの中の
で「$outdata」に突っ込んでいます。
「$outdata」が空なら最上位桁なので元の文字を入れて、
それ以外なら「0」を入れていますよ。
$outdataの中身は
""
↓
"4"
↓
"40"
↓
"400"
のように変わっていきます。
結果として、456が400になる理屈です。
ちなみに、三項演算子の使用に抵抗がないなら
とか書いてもOKです。
三項演算子に慣れていないと処理の内容が分かりにくいですが、
見た目は、こっちの方がスッキリしていますね。
これが「1文字ずつに分割して最初以外を0に置き換えて再結合する」です。
次に「1桁になるように割って小数点以下を切り捨てて元の桁に戻す」をやってみます。
……(--)
できた!φ(--)
せ、説明しておきましょうか(^^;
で元の数字の桁数を取得しています。
元の数字が456なら「3」が取得できます。
は……なんて説明しましょうね?
元の数字が456なら10の3-1乗で100です。
・2→1
・23→10
・456→100
・7890→1000
のような値が取得できます。
元の数字を割って1桁にするための値です。
は、元の数字を割って最上位桁が1の位になるようにしています。
456÷100で4.56です。
は、割り算して最上位桁が1の位になるようにした後で小数点以下を切り捨てています。
floor()は切り捨ての関数です。
456÷100で4.56になり、小数点以下が切り捨てられて4になります。
いよいよ最後です。
は、割り算して最上位桁が1の位になるようにした後で小数点以下を切り捨てたものを
元の桁数に戻しています。
456÷100で4.56になり、小数点以下が切り捨てられて4になったものを100倍して400です。
結果として、456が400になりました。
1.最上位桁が1の位になるように割って
2.小数点以下を切り捨てて
3.元の桁数に戻す
の流れですね。
これをサクっと1行で書いたのが
です。
もし見やすさを求めたいのであれば、例えば
のように分けて書けばマシになると思います。
やっていることは同じですけどね。
少しは見やすいはずです。
これが「1桁になるように割って小数点以下を切り捨てて元の桁に戻す」です。
……パッと見で、どっちが分かりやすいかは微妙だなぁ(--ゞ
取りあえず、そんな感じ\(--)/
1文字ずつに分割して最初以外を0に置き換えて再結合する
もしくは
1桁になるように割って小数点以下を切り捨てて元の桁に戻す
とすることで、できました。
それでは詳細を書いていきます。
諸般の事情により
・2→2
・23→20
・456→400
・7890→7000
のように、数値(自然数)の最上位桁以外を0にしたかったのです。
やり方はいろいろあるだろうけど、どうしようね(--?と
5分くらい考えたところ、以下の2通りのやり方を思いつきました。
1.1文字ずつに分割して最初以外を0に置き換えて再結合する
2.1桁になるように割って小数点以下を切り捨てて元の桁に戻す
せっかくなので、両方やってみましょう。
前提条件は
・「$indata」に元の数字(456とか)が入っている
・「$indata」の整合性チェック(数値チェックとか)は済んでいる
・「$outdata」に結果を入れる
です。
まずは「1文字ずつに分割して最初以外を0に置き換えて再結合する」からやります。
……(--)
できた!φ(--)
$outdata = "";
foreach(str_split($indata) as $value){
if($outdata == ""){ //最上位桁
$outdata .= $value;
}else{ //最上位桁以外
$outdata .= "0";
}
}
foreach(str_split($indata) as $value){
if($outdata == ""){ //最上位桁
$outdata .= $value;
}else{ //最上位桁以外
$outdata .= "0";
}
}
簡単に説明しておくと
foreach(str_split($indata) as $value){
の
str_split($indata)
で「$indata」を文字列として1文字ずつに分割しています。
「456」なら「4」と「5」と「6」に分けているわけです。
その結果をforeachで回すことによって、1文字ずつ処理しています。
あとはループの中の
if($outdata == ""){ //最上位桁
$outdata .= $value;
}else{ //最上位桁以外
$outdata .= "0";
}
$outdata .= $value;
}else{ //最上位桁以外
$outdata .= "0";
}
で「$outdata」に突っ込んでいます。
「$outdata」が空なら最上位桁なので元の文字を入れて、
それ以外なら「0」を入れていますよ。
$outdataの中身は
""
↓
"4"
↓
"40"
↓
"400"
のように変わっていきます。
結果として、456が400になる理屈です。
ちなみに、三項演算子の使用に抵抗がないなら
$outdata = "";
foreach(str_split($indata) as $value){
$outdata .= ($outdata == "" ? $value : 0);
}
foreach(str_split($indata) as $value){
$outdata .= ($outdata == "" ? $value : 0);
}
とか書いてもOKです。
三項演算子に慣れていないと処理の内容が分かりにくいですが、
見た目は、こっちの方がスッキリしていますね。
これが「1文字ずつに分割して最初以外を0に置き換えて再結合する」です。
次に「1桁になるように割って小数点以下を切り捨てて元の桁に戻す」をやってみます。
……(--)
できた!φ(--)
$outdata = floor($indata / pow(10, strlen($indata) -1)) * pow(10, strlen($indata) -1);
せ、説明しておきましょうか(^^;
strlen($indata)
で元の数字の桁数を取得しています。
元の数字が456なら「3」が取得できます。
pow(10, strlen($indata) -1))
は……なんて説明しましょうね?
元の数字が456なら10の3-1乗で100です。
・2→1
・23→10
・456→100
・7890→1000
のような値が取得できます。
元の数字を割って1桁にするための値です。
$indata / pow(10, strlen($indata) -1)
は、元の数字を割って最上位桁が1の位になるようにしています。
456÷100で4.56です。
floor($indata / pow(10, strlen($indata) -1))
は、割り算して最上位桁が1の位になるようにした後で小数点以下を切り捨てています。
floor()は切り捨ての関数です。
456÷100で4.56になり、小数点以下が切り捨てられて4になります。
いよいよ最後です。
floor($indata / pow(10, strlen($indata) -1)) * pow(10, strlen($indata) -1);
は、割り算して最上位桁が1の位になるようにした後で小数点以下を切り捨てたものを
元の桁数に戻しています。
456÷100で4.56になり、小数点以下が切り捨てられて4になったものを100倍して400です。
結果として、456が400になりました。
1.最上位桁が1の位になるように割って
2.小数点以下を切り捨てて
3.元の桁数に戻す
の流れですね。
これをサクっと1行で書いたのが
$outdata = floor($indata / pow(10, strlen($indata) -1)) * pow(10, strlen($indata) -1);
です。
もし見やすさを求めたいのであれば、例えば
$keta_num = strlen($indata);
$keta = pow(10, $keta_num -1);
$outdata = floor($indata / $keta) * $keta;
$keta = pow(10, $keta_num -1);
$outdata = floor($indata / $keta) * $keta;
のように分けて書けばマシになると思います。
やっていることは同じですけどね。
少しは見やすいはずです。
これが「1桁になるように割って小数点以下を切り捨てて元の桁に戻す」です。
……パッと見で、どっちが分かりやすいかは微妙だなぁ(--ゞ
取りあえず、そんな感じ\(--)/