@blog.justoneplanet.info

日々勉強

PHP Formatting Strings(文字列の整形)

■数字の整形

以下のように、PHPではnumber_format関数を使用して、数字を整形することができる。その時の引数の数として成立するパターンは以下の通りである。第二引数では小数以下の桁数を明示し、第三引数と第四引数で小数点の区切りと千単位の区切りを明示する。

<?php
$num = '100000000.12345';
print(number_format($num));//100,000,000
print(number_format($num, 3));//100,000,000.123
print(number_format($num, 3, '.', ','));//100,000,000.123
?>

各関数について

string number_format(float $num[, int $decimals[, string $dec_point, string $thousand_sep]])
1つ、2つ、4つの引数をとる。第一引数にはフォーマットする数字を指定し、第二引数では小数点以下の桁数を表示する。第三引数と第四引数は、それぞれ小数点の区切り文字と千ごとの区切り文字を指定する。

少し話が逸れてしまうが、フランスなどでは千単位の区切りにスペース(もしくはドット)を使用し、小数と整数の区切りにカンマを使うようだ。

■地域に依存した文字列の整形

ロケール情報のセット

以下のようにsetlocale関数を使用して、地域情報をセットする。第一引数ではカテゴリを指定し、第二引数ではロケールを文字列もしくは配列で指定する。

<?php
setlocale(LC_MONETARY, 'en_US');
?>

ロケールに基づいた文字列の整形

以上をふまえて、金額文字列に変換するには以下のようにmoney_format関数を使用する。但し、この関数はWindows環境(Windowsサーバー)では現在のところ使用できない。

<?php
$num = '100000000.98765';
setlocale(LC_MONETARY, 'en_US');
print(money_format('%.2n', $num));//$100,000,000.99

setlocale(LC_MONETARY, 'ja_JP.UTF-8');
print(money_format('%.2n', $num));//¥100,000,000.99
?>

小数が不要の場合は、以下のコードの後者のようにすれば良い。

<?php
$num = '100000000.796';
setlocale(LC_MONETARY, 'en_US');
print(money_format('%.2i', $num));//USD 100,000,000.80

setlocale(LC_MONETARY, 'ja_JP.UTF-8');
print(money_format('%i', $num));//JPY 100,000,001
?>

各関数について

string setlocale(int $category, string $locale)
第一引数のカテゴリにおいて、第二引数のロケールを設定する。
string money_format(string $format, float $num)
数値を金額文字列にフォーマットする。

フォーマット文字について

% 文字をそのまま返す。
. ピリオドに続く数字で小数の桁数を指定する。この桁数に出力が丸められる。
i ロケールの国際フォーマットでフォーマットする。
n ロケールの国内フォーマットでフォーマットする。

■書式文字列を指定した整形

以下のようにprintf関数は、書式文字列を指定された値で置き換えた文字列を出力する。但し、出力せずにデータとして扱いたい場合は、sprintf関数を使用する。また、%を出力したいときは%%と記述する。

<?php
$year = '2009';
$month = '4';
$day = '26';
printf('%04d/%02d/%02d', $year, $month, $day);//2009/04/26
//$date = sprintf('%04d/%02d/%02d', $year, $month, $day);
?>

どうもC言語の経験がないせいか、よく分からん・・・そんなときは書いて覚えるべし。

<?php
for($i = 0; $i < 101; $i = $i + 10){
    printf('%.2f%% 完了しました', $i);
}
/*
0.00% 完了しました
10.00% 完了しました
20.00% 完了しました
30.00% 完了しました
40.00% 完了しました
50.00% 完了しました
60.00% 完了しました
70.00% 完了しました
80.00% 完了しました
90.00% 完了しました
100.00% 完了しました
*/
?>

やはりコノ関数は日付の整形時にもっとも見かける。従って、もう一度。

<?php
$year = 2008;
$month = 6;
$day = '1';
printf('%04d/%02d/%02d', $year, $month, $day);
/*
2008/06/01
*/
?>

各関数について

int printf(string $format[, mixed $args[, mixed $args, …]])
文字列などをフォーマットして出力する。
string sprintf(string $format[, mixed $args[, mixed $args, …]])
文字列などをフォーマットして返す。
%の後に続く指定子
-もしくは+ 符号指定子。デフォルトでは整数が負の値のときだけ、-が付く。
パディング指定子 指定の桁数に足らなかったときに、詰める文字。スペースもしくは0のみ指定可能。
表示幅指定子 出力の桁数を指定する。
精度指定子 小数点の桁数を指定する。
型指定子
% 引数は不要
d 引数を10進数の整数として扱う
e 引数を科学記法として扱う

■フォーマットに基づいた文字列の分解

PHPでは以下のようにsscanf関数を使って、printf風のフォーマットに基づき文字列を分解できる。

<?php
$str = '123 456 789';
$format = '%d %d %d';
var_dump(sscanf($str, $format));
/*
array(3) {
  [0]=>
  int(123)
  [1]=>
  int(456)
  [2]=>
  int(789)
}
*/
$str = '123 aaa 789';
$format = '%d %d %d';
var_dump(sscanf($str, $format));
/*
array(3) {
  [0]=>
  int(123)
  [1]=>
  NULL
  [2]=>
  NULL
}
*/
?>

うーん、イマイチ有用性がわからん。。。

各関数について

mixed sscanf(string $str, string $format)
フォーマット文字列で文字列を処理する。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment