それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

printf のフォーマットを使って覚える。(基数変換も簡単)

printf のフォーマットの例

printf で文字の整列などをすれば楽ちんだろうとは思うんだけど、なかなか覚えきれないので、いくつか例を以て覚えておきたい。

takuya@Desktop$ ruby /Users/takuya/printf_examples.sh
printf %d      32 => '32   '  # 数字
printf %5d     32 => '   32'  # 右寄せ
printf %-5d    32 => '32   '  # 左寄せ
printf %04d    32 => '0032 '  # 0埋め
printf %-05d   32 => '32   '  # 0埋め+左寄せ
printf %+d     32 => '+32  '  # 符号(+)
printf %+d    -32 => '-32  '  # 符号(-)
printf %.1f   -32 => '-32.0'  # 小数桁1
printf %.2f    32 => '32.00'  # 小数桁2
printf %#x     32 => '0x20 '  # 16進数
printf %#o     32 => '040  '  #  8進数
printf %#b     32 => '0b100000'  #  2進数
printf %#08b    7 => '0b000111'  #  2進数0埋め

覚えると便利だけど、16進数と10進数の変換(基数変換)も簡単に行える。

単純なコマンドで行える。

takuya@Desktop$ printf "%#x\n"  666
0x29a

このような場合、"666" (文字)666 (int数字) の考慮が必要ですが。基数変換の場合は、基本的に数字として解釈してくれるので便利です。

16進数の例。

int を hex に変換する(16進数)は簡単に計算できる。

printf %#x   1  # =>  0x1
printf %#x   2  # =>  0x2
printf %#x  10  # =>  0xa
printf %#x  15  # =>  0xf
printf %#x  16  # => 0x10
printf %#x  17  # => 0x11
printf %#x  31  # => 0x1f
printf %#x  32  # => 0x20
printf %#x 255  # => 0xff

使ったソースコード

配列を使うのにruby を使ってるけど、実質はbash の printfを呼び出しているだけです。

#!/usr/bin/env ruby

formats = {
  '数字'    => [ "%d", 32 ],
  '右寄せ'  => [ "%5d", 32 ],
  '左寄せ'  => [ "%-5d", 32 ],
  '0埋め'   => [ "%04d", 32 ],
  '0埋め+左寄せ'   => [ "%-05d", 32 ],
  '符号(+)' => [ "%+d", 32 ],
  '符号(-)' => [ "%+d", -32 ],
  '小数桁1'  => [ "%.1f", -32 ],
  '小数桁2'  => [ "%.2f",  32 ],
  '16進数'  => [ "%#x",  32 ],
  ' 8進数'  => [ "%#o",  32 ],
  ' 2進数'  => [ "%#b",  32 ],
  ' 2進数0埋め'  => [ "%#08b",  7 ],
  # '金額'  => [ "%'d",  32 ], not supported

}


for k, e in formats do 

  f = e[0]
  v = e[1]

  printf( "prinft %-5s %4s => '%-5s'  # %-5s \n" , f, v , f%v, k   )

end

2024-08-15

prinft の typo を修正

関連資料

prinft %s は文字列の長さが指定できる! - それマグで!