# 7.1 文字列
# 7.1.2 書式指定

# 7.1.2.1 %を使った古いスタイル
# 文法：string（変換型） % data
# string（変換型）：%s（文字列）,
# %d（10進整数）, %o（8進整数）, %x（16進整数）,
# %f（10進float）, %e（指数形式float）, %g（10進float or 指数形式float）, %%（リテラルの%）
print('--- 7.1.2.1 ---')
print('%%s:%10s, %%d:%d, %%o:%o, %%x: %x' % (42, 42, 42, 42))
print('%%f:%f, %%e:%e, %%g:%g, %%:%d%%' % (42, 42, 42, 42))

# 左/右揃えの幅制限（超えてもカットしない、足りなければスペースで補完）
print('%10d, %5f, %10s' % (123456, 12.1, 'string cheese'))
print('%-10d, %-5f, %-10s' % (123456, 12.1, 'string cheese'))

# フィールド幅　＋　字数の制限
# ※ fの場合、小数点以下の桁数設定
# ※ dの場合、超えたらカットしない、足りなければ0で補完
print('%-10.3d, %-5.3f, %-10.5s' % (12, 12.1, 'string cheese'))

# フィールド幅指定せず、字数のみ制限（fの場合、小数点以下の桁数設定）
print('%-.3d, %.3f, %.5s' % (12, 12.1, 'string cheese'))

# フィールド幅、字数をハードコードせず、引数から指定
print('%*.*d, %*.*f, %*.*s' % (-10, 3, 12, -5, 3, 12.1, 10, 5, 'string cheese'))

# 7.1.2.2 {}と書式指定を使った新しいスタイル
print('--- 7.1.2.2 ---')
n, f, s = 42, 7.03, 'string cheese'
# 最も簡単な使い方、formatの引数の順序で書式部分へ出力する
print('{}, {}, {}'.format(n, f, s))
# 書式に番号（0から）を指定することによって、引数とマッピングする
print('{2}, {0}, {1}'.format(n, f, s))
# 書式にキーを指定することによって、引数マップとマッピングする（必ず引数マップ、format(n, f, s)はだめ）
print('{f}, {s}, {n}'.format(n=42, f=7.03, s='string cheese'))

# 辞書に合わせて使用することができる。0は辞書全体を指す、1は後ろの文字列
d = {'n': 42, 'f': 7.03, 's': 'string cheese'}
print('{0[n]}, {0[f]}, {0[s]}, {1}'.format(d, 'other'))

# {位置引数:型指定子}という形で書式の型も指定できる
print('{0:d}, {1:f}, {2:s}'.format(n, f, s))

# フィールド幅の下限、文字数も下記の通り指定できる。
# ただ、古いスタイルと違うのは、左、右揃え（デフォルト）は「+」、「-」ではなく、「<」、「>」で指定する、そして中央揃えは「^」
# もう一つ違うのは、整数(%d)の場合、
# 文字数（小数点以下の部分）制限の指定はできなくなる（float（%f）, 文字列(%s)はできる）
print('{n:>10d}, {f:<10.2f}, {s:15.5s}'.format(n=42, f=7.03, s='string cheese'))
# パディング：出力フィールドの隙間の部分をスペース以外の文字で埋めたい場合、
# 「:」の直後、位置揃えや幅指定の前に指定する。
print('{n:!^10d}, {f:@^10.2f}, {s:-^15.5s}'.format(n=42, f=7.03, s='string cheese'))
