• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:前スペース補填)

sprintfで前スペースを入れる方法とその使い方

このQ&Aのポイント
  • 『前ゼロ』に続き、次は『前スペース』のやり方について質問です。sprintfを使用して特定の桁数の前スペースを入れる方法について教えてください。
  • 具体的なやりたいことは、cgiで特定の桁数の前スペースを含ませたデータを表示する際、各項目が揃うようにしたいというものです。
  • 現在試している方法は、sprintfを使って特定の桁数の前スペースを入れることですが、うまくいっていません。どのようにすれば欲しい結果を得ることができるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.1

<pre>~</pre> で出力結果をくくってやれば、スペーシングがそのままブラウザに表示できると思います。

nagahaha
質問者

お礼

早速有り難うございました。 出来ました。 やはり画面表示の時に消えていたのですね、 <pre>というタグがあったのですね。 編集結果をそのまま表示するというタグですね。 ただ、実際に表示できたのですが、 ベタ打ちにならず数行開いてしまうように表示されますが、 どう云うわけでしょうか。 また、ついでで恐縮ですが、 項目が全てスペースの場合に1個だけ0が入りますが、 そっくりスペースにするにはどんな編集パタンを使えば宜しいのでしょうか。 宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.4

「コーディングの全て」をこちらの環境でためすと "%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でした。 しかし、経験上開発環境としては、多少の差異はないはずです。

nagahaha
質問者

お礼

atom_seedさん、 本当にお手数をかけております、申し訳在りません。 全て了解です、見事に表示されていますね。 まとめると、ソースコードには誤りがない、ということですね。 そして何かの環境がatom_seedさんと私とで違うと。 ちなみに私のActivePrelをみてみましたら、5.6.1でした。 この違いにより出方が違うということは考えられるのでしょうか。 何年も前にインストールしたままで使っています。 ヴァージョンの関係で、桁の表示もうまく行かないということはあるのでしょうか、 基本的なところなので違わないような気がしますが。不思議です。 そもそも<pre>というタグはそのままを表示するということですから、 ブラウザなどにディペンドするのでしょうか。 私のI/E6.0は特にいじっていませんが。 逆に、こういうものだということを前提に、 何かを入れたりすることで、atom_seedさんみたいにベタ打ちとすることが出来るのでしょうか。 いろいろ調べているつもりですが、 これだという解決にたどり着けません。 とにかく、もう少し調べてみます。 何回も何回も有り難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • atom_seed
  • ベストアンサー率48% (25/52)
回答No.3

提示していただいたソースを元に、自分なりに各所修正し手動作するものに書き換えてみました。 ●文字化け対策を追加 ●サブルーチンを正規化 ●<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 }

nagahaha
質問者

お礼

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 ************ここまで

nagahaha
質問者

補足

書ききれなくて、お礼の続きです。 【コーディングの全てです。】 ************ここから #!/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)
回答No.2

> ただ、実際に表示できたのですが、 > ベタ打ちにならず数行開いてしまうように表示されますが、 > どう云うわけでしょうか。 おそらく output関数の中に追加されたのでしょうが、foreach の外側で記述するようにしてください。 print "<pre>\n"; foreach $line (@kariire) { (中略) } print "</pre>\n"; > また、ついでで恐縮ですが、 > 項目が全てスペースの場合に1個だけ0が入りますが、 こちらは、症状が確認できませんでした。

nagahaha
質問者

お礼

何回も有り難うございます。 また、お礼が遅くなりました。 始めは指摘されたように、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>はとっても変わりませんでした。 何処か、根本的におかしいのでしょうか。 お手数をおかけします。 宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • sprintfで0ならスペースにしたい

    お世話になります。 sprintfを使って編集しています。 3桁で統一したいため、 $trm01 = sprintf("%3d",$trm01); のようにやっています。 $trm01が0の場合、3桁のスペースとしたいのですが。 宜しくお願いします。

    • ベストアンサー
    • Perl
  • スペースパディングのやり方を教えてください。

    http://www.php.net/manual/ja/function.sprintf.php などを参考にして数値型の整形をしようと思います。 1005という数値を7桁にしたい場合 "__1,005" (先頭スペースは2つアンダーバーで表示) という感じで頭にスペースパディングを入れて 3桁ごとにカンマをつけたいのです。 まずはスペースを入れようと思い sprintf("%4d",1005); sprintf("%' 4d",1005); と試してみましたがスペースがひとつしか入りません。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=905463 なども参考にしましたがなかなかうまくいきません。 よい方法があれば宜しくお願いいたします。

    • 締切済み
    • PHP
  • フォルダーの深さの限界

    linux上のgccを用いて計算処理をさせるつもりです。 1.下記の動作はうまく行きました。(フォルダ名を一部伏字にしています)。 sprintf(input_file,"./w****/o*****/%d.txt",i); sprintf(output_file,"./testout/%d.txt",i); input_fileを入力し、計算処理し、output_fileに出力する。 計算しやすいようにファイル名は自然数を使います。 2. ただし、下記の動作はうまく行かないです。 sprintf(input_file,"./w****/o*****/live/%d.txt",i); sprintf(output_file,"./testout/%d.txt",i); PCの動作が中断します。 input_fileの階層が一段増えたせいなのかもしれません。 どなたか解決法を教えてください。

  • こんな有料レンタルHPスペースありませんか?

    ・ブラウザ上でファイルのアップロードができる,ブラウザ上でHTMLファイルが作成できる。 ・広告がでない。 ・月額600円程度(一年契約で月600円でもいいです。) ・アドレスが非常に覚えやすい。 ・CGIが使える。(チャットは使えなくていいです。掲示板ができるだけで十分です。) ・メールもHPスペースといっしょにとれる(一個だけでいいです。 ・容量は二桁あればいいですが,できれば30MBか50MBほしいです。それと容量の増やせるほうがいいです。 ・それとこれは別になくてもいいですが,お小遣い稼ぎとして広告をのせれる。 とこんなもんなんですが・・・ こんないいところないでしょうか?わがままばかりですいません。 やっぱないですかね? わがままだらけでほんとにすいません。

  • バッチファイル For 文 スペース

    いつも大変御世話になっております。 WindowsXP環境下の 【D:\test】フォルダ直下に TEST.conf というファイルがあり 中身は1行こんな文があります。↓ test001=12345 6 そして 【D:\test\bat】フォルダ直下に TEST.bat というファイルがあり 中身のードはこんなコードです。↓ For /F "tokens=1*" %%i in (..\TEST.conf) do set %%i SET IN_FILE=%test001% 実行結果は SET IN_FILE=12345 になりました。 なぜ SET IN_FILE=12345 6 ではないのですか? スペースを _ (アンスコ)など何か入れてあげると SET IN_FILE=12345_6 上記バッチファイルのFor文では、スペース手前までしか見てくれないのでしょうか? 他に方法は無いのでしょうか? もしご存知の方がいらっしゃるようでしたら、お手数ですが 実現可能かどうかをご回答願いますでしょうか? 以上、何卒宜しくお願い致します。

  • CGIのforeach文

    CGIを作成していてforeach文のところを通ってくれません。原因が不明なのですが下記でおかしいことなどがあったらおしえてください。 お願いします。 $entrycgi = "./touhyou.cgi"; $Location = '../images'; $imgVote = $Location."/click.gif"; $votefile = "./database/vtbl.dat"; sub vote_form{ print "<FORM ACTION=\"$entrycgi\" METHOD=\"post\" NAME=\"Form\">\n"; print "<INPUT TYPE=\"hidden\" NAME=\"proc\" VALUE='entry'>\n"; print "<INPUT TYPE=\"hidden\" NAME=\"Action\">\n"; print "<TABLE><TR><TD><IMG SRC=\"$Location."/top.gif\"></TD></TR></TABLE>\n"; open(FILE, "+<$votefile"); @output = <FILE>; close(FILE); print "<TABLE><TR>\n"; $i = 1; @output_sort = sort { $b <=> $a } @output; foreach $output_sort(@output_sort){ ($COUNT, $NM, $FILENM, $NO) = split(/\,/, $output_sort); $filename = $Location.$FILENM; print "<IMG SRC='$filename' HEIGHT=100 WIDTH=100></TD>\n"; if ($i == 5) { last; } else { print "<TD width=\"50\"></TD>\n"; $i++; } } print "</TR></TABLE>\n"; }

    • ベストアンサー
    • CGI
  • 半角スペースが有効にならない。

    前のページで入力された値を取得するCGIですが、どうしても半角スペースを認識しません。 それどころか、半角スペースの後ろを一切消してデータを取得しています。 同じように作成したものはきちんと動いているのに…。 どこが間違ってるかご指摘お願いします。 ---------- #!/usr/local/bin/perl read(STDIN,$buffer,$ENV{'content_length'}); @atai = split(/&/,$buffer); foreach $atais(@atai){ ($key, $value) = split(/=/, $atais); $FORM{$key}=$value; } $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $buffer =~ tr/+/ /; $value =~ tr/+/ /; $key =~ tr/+/ /; print "Content-type:text/html\n\n"; print "$key<BR>\n"; print "<A HREF=./***.cgi>Back</A><BR>\n"; open (FH,">***.log"); @filew="$buffer\n"; print FH @filew; close(FH); exit; ---------- 以上です。よろしくお願いします。

    • ベストアンサー
    • CGI
  • 書き込んだばかりのcookieが読み込めません

    cookieを書込んだ直後、書込めたか(cookieをオフにしていたり、cookieを書込めない携帯端末からのアクセスかもしれないので)確認をしようと、cookieを読込もうとしたのですが、cookieが書込まれているにもかかわらず情報を取得することができません 実験環境として、htmlファイルにボタンを作って、cgiへ飛び、そのcgi内でcookieを書込み、cookieが書込めたかどうかで分岐して、表示するようにしています (cgiを一度実行したあと一旦ブラウザで前のhtmlファイルに戻って)cookieが既に書込まれた状態で、改めてhtmlファイルのボタンを押せばcookieは読込めますが、最初にcookieを書込んだ時に同じcgi内で即読込みを行ったら読込めません 書込が完結する前に読込みに行っているから読込めないのかとも思い、読込み前にタイムラグを作っても見ましたがやはり読込めません どうすれば書込み直後に読み込めるのでしょうか? 色々ネットで調べても見ましたが、いっこうに解決策が見つかりません ご存じの方ぜひご教授下さい よろしくお願いします なお、下にperlのコードを書いておきます #クッキーを書込 $test{sid} = "12345"; &set_cookie($test{sid}); #タイムラグ use Time::HiRes; Time::HiRes::sleep(0.8); #クッキーを読込 ($cookie{test}) = &get_cookie; if(!$cookie{test}){ print "読み込めてない"; } else{ print "読み込めた"; } ######→読み込めません##### #クッキー書込sub sub set_cookie { local(@cook) = @_; local($gmt, $cook, @t, @m, @w); @t = gmtime(time + 2*60*60); @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]); foreach (@cook) { s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $cook .= "$_<>"; } print "Set-Cookie: SID=$cook; expires=$gmt; path=/;\n"; } #クッキー読込sub sub get_cookie { local($key, $val, *cook); $cook = $ENV{'HTTP_COOKIE'}; foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } foreach ( split(/<>/, $cook{'SID'}) ) { s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; push(@cook,$_); } return (@cook); }

    • ベストアンサー
    • Perl
  • InDesign 正規表現 一桁の数字

    5(20.0%) 0(0.0%) 10(40.0%) こんな感じで一桁と二桁の数字が混じっている文字列の 一桁の数字の前に数字のスペースをつけて桁揃えしたいです 検索: (?<=[^\d\.])(\d)(?=\D) 置換: ~/$1 こんな感じで書いたんですがこれでは 文字列の一番最初のものが引っかかりません 「行頭または数字かドット以外に続く」 というのを表現できればいいのですが いろいろ試してもうまくいきません どう書けばいいのでしょうか

  • awkを使って文字列処理の問題

    awkで以下のことをやりたいですが、 a.txtの中身は aaaa bbbb cccc の三つのレコードがあります。 b.txtの中身は 東京a 埼玉b 千葉c 東京d になってます。 ファイルa.txtのみっつのレコードのを読み込んできて、b.txtに対して検索して、東京 という文字列があれば、そのレコードは、aaaaに置き換えて、あるファイルに出力する ようなスクリプトを書きたいです。 どう書けば、いいですか?教えていただけませんか?