- ベストアンサー
sprintfで前スペースを入れる方法とその使い方
- 『前ゼロ』に続き、次は『前スペース』のやり方について質問です。sprintfを使用して特定の桁数の前スペースを入れる方法について教えてください。
- 具体的なやりたいことは、cgiで特定の桁数の前スペースを含ませたデータを表示する際、各項目が揃うようにしたいというものです。
- 現在試している方法は、sprintfを使って特定の桁数の前スペースを入れることですが、うまくいっていません。どのようにすれば欲しい結果を得ることができるのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
<pre>~</pre> で出力結果をくくってやれば、スペーシングがそのままブラウザに表示できると思います。
その他の回答 (3)
- atom_seed
- ベストアンサー率48% (25/52)
「コーディングの全て」をこちらの環境でためすと "%7s"でも"%8s"でもそれぞれ正確に動作しました。 以下"%7s"での出力例のコピペです。 --------------------------------------------------- 借入金一覧表 戻る 氏名,事由,異動日,借入額,限度残 47213,1,20080503, 3000, 50000 38221,5,20080508, 25000, 100000 18994,1,20080506, 2700, 385000 38221,5,20080508, 25000, 100000 18994,1,20080506, 2700, 385000 --------------------------------------------------- プログラム以外に原因があるかもしれませんね。。。 ちなみに、こちらの動作環境は、WinXP IE7 ActivePerl5.8.7でした。 しかし、経験上開発環境としては、多少の差異はないはずです。
お礼
atom_seedさん、 本当にお手数をかけております、申し訳在りません。 全て了解です、見事に表示されていますね。 まとめると、ソースコードには誤りがない、ということですね。 そして何かの環境がatom_seedさんと私とで違うと。 ちなみに私のActivePrelをみてみましたら、5.6.1でした。 この違いにより出方が違うということは考えられるのでしょうか。 何年も前にインストールしたままで使っています。 ヴァージョンの関係で、桁の表示もうまく行かないということはあるのでしょうか、 基本的なところなので違わないような気がしますが。不思議です。 そもそも<pre>というタグはそのままを表示するということですから、 ブラウザなどにディペンドするのでしょうか。 私のI/E6.0は特にいじっていませんが。 逆に、こういうものだということを前提に、 何かを入れたりすることで、atom_seedさんみたいにベタ打ちとすることが出来るのでしょうか。 いろいろ調べているつもりですが、 これだという解決にたどり着けません。 とにかく、もう少し調べてみます。 何回も何回も有り難うございました。
- atom_seed
- ベストアンサー率48% (25/52)
提示していただいたソースを元に、自分なりに各所修正し手動作するものに書き換えてみました。 ●文字化け対策を追加 ●サブルーチンを正規化 ●<br>が改行と <pre>タグ内で同義になるので省略 ●sprintf のなかの %dを%sへ変更 print <<"STOPP"; <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE>借入金一覧表\</TITLE> </HEAD> <BODY bgcolor="$bgcolor"> <center> <h3>借入金一覧表\</h3> </center> <a href="$home">戻る</a><br> <pre> 氏名,事由,異動日,借入額,限度残 STOPP open( IN, "$file" ) || &error("Can\'t open $file"); while (<IN>) { my ( $kmk1, $kmk2, $kmk3, $kmk4, $kmk5 ) = split( /<>/, $_ ); $kmk1 = sprintf( "%5s", $kmk1 ); #氏名コード $kmk2 = sprintf( "%1s", $kmk2 ); #借入事由 $kmk3 = sprintf( "%8s", $kmk3 ); #異動日 $kmk4 = sprintf( "%6s", $kmk4 ); #借入額 $kmk5 = sprintf( "%7s", $kmk5 ); #限度額残 &output( $kmk1, $kmk2, $kmk3, $kmk4, $kmk5 ) ; } close(IN); print <<EOF; </pre> EOF exit; sub output { my ( $kmk1, $kmk2, $kmk3, $kmk4, $kmk5 ) = @_; print <<"STOPP"; $kmk1,$kmk2,$kmk3,$kmk4,$kmk5 STOPP }
お礼
atom_seedさま、 大変なお手間をおかけしています。 有り難うございます。 書き直していただいたモノをそっくり使わせていただき、 やってみましたがやはり1行分(?)開いてしまいます。 後ろに全てのコーディングを表示させていただきます、 何処か誤りがあるでしょうか。 そう言いながら、1カ所だけ変えました。 最後の項目は+1しないと桁が落ちてしまいます。 (7桁表示したいので、8としました。) ここら辺も関係しているでしょうか。 私の環境がダメなのでしょうか。 WindowsXP SP2 I/E6.0 SP2です。 少しばかり気になるのは、過去にI/E7.0を一度インストールしたことがあります。 特に素晴らしい点もなかったので、使わない方がいいとの声を聞き、 6.0に戻しています。 お手数をおかけしますが、再度見て頂けると幸いです。 【リスト結果です】 ************ここから 借入金一覧表 戻る 氏名,事由,異動日,借入額,限度残 38152,1,20001005, 3000, 12345 38153,1,20001005, 3000,1234567 38154,1,20001005, 3000, 1234 38155,1,20001005, 3000, 123 38156,1,20001005, 1234, 123456 ************ここまで
補足
書ききれなくて、お礼の続きです。 【コーディングの全てです。】 ************ここから #!/usr/local/bin/perl #2008.5.13 借入金一覧表 $|=1; #データのフラッシュ print "Content-type: text/html\n\n"; # データ形式 $file = "./kariire.log"; $home = "../toukei.html"; $bgcolor = "lightgreen"; #kariiremain print <<"STOPP"; <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE>借入金一覧表\</TITLE> </HEAD> <BODY bgcolor="$bgcolor"> <center> <h3>借入金一覧表\</h3> </center> <a href="$home">戻る</a><br> <pre> 氏名,事由,異動日,借入額,限度残 STOPP open( IN, "$file" ) || &error("Can\'t open $file"); while (<IN>) { my ( $kmk1, $kmk2, $kmk3, $kmk4, $kmk5 ) = split( /<>/, $_ ); $kmk1 = sprintf( "%5s", $kmk1 ); #氏名コード $kmk2 = sprintf( "%1s", $kmk2 ); #借入事由 $kmk3 = sprintf( "%8s", $kmk3 ); #異動日 $kmk4 = sprintf( "%6s", $kmk4 ); #借入額 $kmk5 = sprintf( "%8s", $kmk5 ); #限度額残 &output( $kmk1, $kmk2, $kmk3, $kmk4, $kmk5 ) ; } close(IN); print <<EOF; </pre> EOF exit; sub output { my ( $kmk1, $kmk2, $kmk3, $kmk4, $kmk5 ) = @_; print <<"STOPP"; $kmk1,$kmk2,$kmk3,$kmk4,$kmk5 STOPP } ************ここまで 以上、宜しくお願いします。
- atom_seed
- ベストアンサー率48% (25/52)
> ただ、実際に表示できたのですが、 > ベタ打ちにならず数行開いてしまうように表示されますが、 > どう云うわけでしょうか。 おそらく output関数の中に追加されたのでしょうが、foreach の外側で記述するようにしてください。 print "<pre>\n"; foreach $line (@kariire) { (中略) } print "</pre>\n"; > また、ついでで恐縮ですが、 > 項目が全てスペースの場合に1個だけ0が入りますが、 こちらは、症状が確認できませんでした。
お礼
何回も有り難うございます。 また、お礼が遅くなりました。 始めは指摘されたように、loopの中に書いていました。 それで、外に出したのですが、変化がありませんでした。 以下です。 ***********ここから open(IN,"$file") || &error("Can't open $file"); @kariire = <IN>; close(IN); (1) print <<"STOPP"; <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <TITLE>借入金一覧表</TITLE> </HEAD> <BODY bgcolor="$bgcolor"> <center> <h3>借入金一覧表</h3> </center> <a href="$home">戻る</a><br> 氏名,事由,異動日,借入額,限度残<br> STOPP (2) foreach $line (@kariire) { local($kmk1,$kmk2,$kmk3,$kmk4,$kmk5) = split(/<>/,$line); $kmk1 = sprintf("%5d",$kmk1); #氏名コード $kmk2 = sprintf("%1d",$kmk2); #借入事由 $kmk3 = sprintf("%8d",$kmk3); #異動日 $kmk4 = sprintf("%6d",$kmk4); #借入額 $kmk5 = sprintf("%7d",$kmk5); #限度額残 &output; } exit; sub output { print <<"STOPP"; $kmk1,$kmk2,$kmk3,$kmk4,$kmk5 <br>(3) STOPP } ***********ここまで 中の、(1)、(2)に置いてみましたがダメでした。 また、(3)の<br>はとっても変わりませんでした。 何処か、根本的におかしいのでしょうか。 お手数をおかけします。 宜しくお願いします。
お礼
早速有り難うございました。 出来ました。 やはり画面表示の時に消えていたのですね、 <pre>というタグがあったのですね。 編集結果をそのまま表示するというタグですね。 ただ、実際に表示できたのですが、 ベタ打ちにならず数行開いてしまうように表示されますが、 どう云うわけでしょうか。 また、ついでで恐縮ですが、 項目が全てスペースの場合に1個だけ0が入りますが、 そっくりスペースにするにはどんな編集パタンを使えば宜しいのでしょうか。 宜しくお願いします。