• ベストアンサー

printfやsprintfで、0に符号 (+) をつけない方法

Perlの問題ではないのかなとも思うのですが、 my @num1 = (1, 0, 2, 0); my @num2 = (0, -3, 0, 2); foreach my $num1 (@num1) { my $num2 = shift @num2; printf "%+d%+d\n", $num1, $num2; } などと%+dとすると、0の場合に+0となってしまいます。これを単純に0とするシンプルなやり方はないでしょうか?この場合は foreach my $num1 (@num1) { my $num2 = shift @num2; if ($num1) { printf "%+d%+d\n", $num1, $num2 } else { printf "0%+d\n", $num2 } } とすることで満足する結果となりますが、複数の数値部分で+0となるのを回避したい場合など、このようなif文でやると変に複雑なスクリプトになると思うのですが、そうするしかないでしょうか?

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

my $format = ($num1>0 ? "%+d":"%d").($num2>0 ? "%+d":"%d")."\n"; printf $format, $num1, $num2; とするとか あるいは、sprintfして、s/\+0/0/g するとか

kapura
質問者

お礼

三項演算子をこんな風に使うといいんですね。0とそれ以外というイメージでばかり考えていて、0の場合と負数の場合に%dにするというのは、なるほどと思いました。 上の例では$num2の方は常に%+dでいいので、正確には my $format = ($num1>0 ? "%+d" : "%d") . "%+d\n"; あるいは my $format = ($num1 ? "%+d" : "%d") . "%+d\n"; でしょうか。sprintして、その中の+0のところを置換するというのも、この部分が加わるだけでシンプルでいいですね。 上の例では s/^\+0/0/ な感じかな。勉強になりました。ありがとうございます。

その他の回答 (1)

  • tyunji
  • ベストアンサー率19% (68/349)
回答No.1

表示部分だけサブルーチンにしてしまえば、見た目は複雑にならないと思います。

kapura
質問者

お礼

確かに複雑にならなかったとしても、表示部分を明確にした方が、後で読みやすくていいと思いました。 引数が+0だったら0を返すような関数を自作して使うのもいいかもしれないですね。 ありがとうございます。

関連するQ&A