4

データベースに int (例: 1234512312345) として記録される電話番号がありますが、Web ページでは (12345) 123 - 12345 として表現したいと考えています。それが文字列の場合、substr を使用しますが、それを strval に変換するのは洗練されていないようです。

整数と文字列が明確に異なることは理解していますが、効率の悪い関数を自分で作成せずに、この効果に対して何かを行う手段はありますか?

4

6 に答える 6

11

vprintf または vsprintfsscanfで試すことができます

$data = 1234512312345;
vprintf("(%d)-%d-%d",sscanf($data, "%5d%3d%5d"));

出力

(12345)-123-12345

複数の PHP バージョンのテスト

注意

値を返す場合は、次のようにする必要があります

$var = vsprintf("(%d)-%d-%d",sscanf($data, "%5d%3d%5d"));
        ^
        |---- Note the `s`
于 2013-04-08T10:25:07.603 に答える
7

注:タイトルのためにこれに答える、電話番号を整数として扱うことは良い考えではありません

PHP の型ジャグリング機能を利用し、電話番号に対して文字列関数を使用する必要がありますが、 Cスタイルで行い、整数の操作を維持し たい場合は、次のようにします。

  • 除算/演算子、最初の桁を取得するのに役立ちます ( に除算すると最初の桁が得られますが、関数を使用すると が得られるため、すぐにはできませんが、の結果は型であり、型ではないため、ここでも問題が発生する可能性があります) )123100123/100=1.23floor()floor(123/100)=1floor()floatinteger
  • modulo%演算子。最後の桁を取得するのに役立ちます ( moduloはすぐに整数型の最後の桁を取得します。)12310123%10=3

したがって、次のように電話番号から必要な部分を抽出できます (整数の方法):

$last=$no%100000; // get last 5 digits (modulo by 1 followed by 5 zeroes)

$no=$no-$last; // subtract the last digits from original number

$no=$no/100000; // divide to shorten the number, end up with a natural number

$area=$no%1000; // get last 3 again

$prefix=($no-$area)/1000; //remainder is the first digits of the original number

または(float/ double/real方法)-より読みやすい

$last=$no%1e5; // scientific notation 1e5 = 10000 (1 followed by 5 zeroes)

$no=($no-$last)/1e5;

$area=$no%1e3;

$prefix=($no-$area)/1e3;

ライブ コード: http://codepad.viper-7.com/tVRjXC

注: 科学表記法でeは type を使用しますfloat

また、32 ビット プラットフォームでの最大整数は2^31 = 2.147.483.648


さて、このコードを「電話番号」のように使用0077705501234すると、頭痛の種になります!

したがって、それはデータベースからのものですが、変更によって実際のintPHPが8進数の先頭の数字を解釈0、内部で10進数に変換するため、まったく異なる「電話番号」になります。正確であること。

PHP がそれを として受け取り、string本当に整数を操作したい場合は、型キャスト(int) $noまたは変換$no+0などを行うことができます。

とにかく、先頭のゼロは整数には関係ありませんが、文字列の場合は問題になるため、最終的 77705501234には長さのチェックが必要になる場合があります (整数フロートの方法):

カウントし続けるゼロが多すぎるため、フロートを使用します...

番号には数字が必要であることを知っている13ので、確認することができます。if ( $no > 1e12 )またif ( $no < 1e14 )、確認のためにも使用できます。

数値の「長さ」も知りたい場合 (これにはpow()知る必要があります):

for ($i=1;$i<13;$i++) { //count from 1 to 12
    //stop when $no modulo 10^$i is the number
    if ( $no % pow(10,$i) == $no ) break; 
}
// number of digits of $no are stored in $i - equivalent to strlen()

そして最後に、先行ゼロの整数が欠落している場合でも番号を正しく出力するには:

printf('Your number: (%05u) %03u - %05u',$prefix,$area,$last);

ライブ コード: http://codepad.viper-7.com/Xgr8RQ

補足:大きな数の場合、BCMath関数もありますが、文字列で機能します

于 2013-04-08T13:32:34.840 に答える
0

Webページに表示するだけですか?

はいの場合、1 つの jquery プラグインを使用してこれを行うことができます。

私にとってのベスト:

http://digitalbush.com/projects/masked-input-plugin/

http://igorescobar.github.io/jQuery-Mask-Plugin/

于 2013-04-08T10:27:57.970 に答える