تبدیل فرمت در پایتون، فرمت (پر کردن صفر، نماد نمایی، هگزادسیمال و غیره)

کسب و کار

برای تبدیل (فرمت) یک عدد یا رشته به فرمت های مختلف در پایتون، از فرمت تابع داخلی () یا روش رشته str.format() استفاده کنید.

در این قسمت نحوه استفاده از توابع زیر را توضیح خواهیم داد.

  • تابع داخلی (به عنوان مثال در زبان برنامه نویسی)format()
  • روش رشتهstr.format()

ضمناً رشته مشخصات فرمت برای تبدیل به فرمت زیر با نمونه کد توضیح داده شده است.

  • موجه چپ، موجه از مرکز، موجه راست
  • پر شدن صفر
  • علامت (بعلاوه یا منفی)
  • جداکننده رقم (کاما، خط زیر)
  • اعداد باینری، اکتال و هگزادسیمال
  • تعداد ارقام بعد از اعشار را مشخص کنید
  • ارقام مهم (تعداد ارقام قابل توجه)
  • نماد نمایی
  • نمایش درصد

توجه داشته باشید که از پایتون 3.6، رشته‌های f (f-strings) به متد رشته‌ای str.format() اضافه شده است تا مختصرتر شود.

تابع داخلی: format()

format() به عنوان یک تابع داخلی استاندارد پایتون ارائه شده است.

طرح کلی به شرح زیر است.

  • format(value, format_spec)
    • استدلال اول:value
      ارزش اصلی. رشته رشته، عدد int، float و غیره
    • استدلال دومformat_spec
      رشته مشخصات قالب خیابان رشته
    • مقدار بازگشتی: یک رشته قالب بندی شده

نمونه هایی در زیر نشان داده شده است. انواع رشته های قالب بندی و نحوه نوشتن آنها در ادامه توضیح داده شده است.

در این مثال، از لفظ های عددی و حرف های رشته ای به عنوان اولین آرگومان استفاده کرده ایم، اما البته می توانید از متغیرهایی استفاده کنید که حاوی این مقادیر هستند.

s = format(255, '04x')
print(s)
print(type(s))
# 00ff
# <class 'str'>

print(format('center', '*^16'))
# *****center*****

روش رشته str.format()

همچنین یک متد format() برای نوع string وجود دارد.

{} در رشته str که متد ()format را فراخوانی می کند، فیلد جایگزینی نامیده می شود و با آرگومان متد format() جایگزین می شود.

رشته مشخصات قالب باید در فیلد جایگزین {} و به دنبال آن “:” نوشته شود.

مقدار بازگشتی یک رشته رشته فرمت شده است.

فرآیند معادل فرمت تابع داخلی () که در بالا توضیح داده شد به شرح زیر است.

s = '{:04x}'.format(255)
print(s)
print(type(s))
# 00ff
# <class 'str'>

print('{:*^16}'.format('center'))
# *****center*****

باز هم از حروف عددی و لفظ رشته ای به عنوان آرگومان استفاده می کنیم، البته متغیرها نیز قابل قبول هستند.

تعیین آرگومان برای فیلدهای جایگزین

آرگومان ها را به ترتیب مشخص کنید (پیش فرض)

ممکن است چندین فیلد جایگزین {} وجود داشته باشد و به طور پیش‌فرض، آرگومان‌های متد به ترتیب پردازش می‌شوند. اگر رشته مشخصات قالب در {} حذف شود، فقط توسط str() به رشته تبدیل می شود.

برای درج مقادیر متغیر در رشته و چاپ آنها مفید است.

print('{}-{}-{}'.format('100', '二百', 300))
# 100-二百-300

یک آرگومان موقعیتی برای مقادیر صحیح مشخص کنید

اگر یک مقدار صحیح در {} مشخص شود، مانند {0} یا {1}، خروجی به ترتیب آرگومان ها بستگی دارد. همین عدد را می توان بارها و بارها استفاده کرد. این زمانی مفید است که بخواهید همان مقدار را در یک رشته وارد کنید.

print('{0}-{1}-{0}'.format('foo', 'bar'))
# foo-bar-foo

آرگومان های کلمه کلیدی را برای نام های دلخواه (رشته ها) مشخص کنید

همچنین می توانید هر نامی را در {} مشخص کنید و آن را به عنوان آرگومان کلمه کلیدی وارد کنید.

print('{day}/{month}/{year}/'.format(day=11, month=1, year=2018))
# 11/1/2018

فهرست یا فرهنگ لغت را به عنوان آرگومان مشخص کنید

فهرست ها و فرهنگ لغت ها را می توان به عنوان آرگومان مشخص کرد.

از [] برای مشخص کردن فهرست فهرست یا کلید فرهنگ لغت در یک فیلد جایگزین استفاده کنید. توجه داشته باشید که علامت نقل قول “‘” و “” برای تعیین کلیدهای فرهنگ لغت استفاده نمی شود.

اگر می خواهید از همان آرگومان به طور مکرر استفاده کنید، باید یک مقدار صحیح یا یک رشته (نام) را همانطور که در بالا توضیح داده شد مشخص کنید.

l = ['one', 'two', 'three']
print('{0[0]}-{0[1]}-{0[2]}'.format(l))
# one-two-three

d1 = {'name': 'Alice', 'age': 20}
d2 = {'name': 'Bob', 'age': 30}
print('{0[name]} is {0[age]} years old.\n{1[name]} is {1[age]} years old.'.format(d1, d2))
# Alice is 20 years old.
# Bob is 30 years old.

می توان آن را به عنوان یک آرگومان موقعیتی با اضافه کردن * به لیست و مشخص کردن آن به عنوان آرگومان یا به عنوان آرگومان کلیدواژه با ضمیمه ** به فرهنگ لغت و مشخص کردن آن به عنوان آرگومان گسترش داد.

l = ['one', 'two', 'three']
print('{}-{}-{}'.format(*l))
# one-two-three

d = {'name': 'Alice', 'age': 20}
print('{name} is {age} years old.'.format(**d))
# Alice is 20 years old.

شرح براکت های مجعد {}

اگر می‌خواهید براکت‌های مجعد {,} را در متد ()format بنویسید، آن را دوبار مانند {{,}} تکرار کنید. توجه داشته باشید که نمی توان از بک اسلش ها فرار کرد.

print('{{}}-{num}-{{{num}}}'.format(num=100))
# {}-100-{100}

رشته فرمت شده

در هر دو مورد، برای تعیین فرمت، بعد از مقدار صحیح یا رشته نام در {}، عبارت “:format string” را بنویسید.

print('{num:x}'.format(num=255))
# ff

print('{day}/{month:02}/{year:02}/'.format(day=11, month=1, year=2018))
# 11/01/2018

در ادامه نحوه تعیین فرمت با استفاده از رشته فرمت را توضیح خواهیم داد. کد نمونه از روش رشته str.format() استفاده می کند، اما همان رشته فرمت را می توان با فرمت تابع داخلی استفاده کرد. در فرمت تابع داخلی ()، رشته مشخصات فرمت به عنوان آرگومان دوم مشخص می شود.

موجه چپ، موجه از مرکز، موجه راست

در زیر می توانید با توجیه چپ، موجه از مرکز، توجیه راست و غیره تراز کنید. تعداد کل کاراکترها را به صورت عدد مشخص کنید.

  • <
  • ^
  • >
print('left  : {:<10}'.format(100))
print('center: {:^10}'.format(100))
print('right : {:>10}'.format(100))
# left  : 100       
# center:    100    
# right :        100

شما همچنین می توانید یک کاراکتر را مشخص کنید که باید پر شود. اگر حذف شود، مانند مثال بالا، یک فاصله است.

می توانید از کاراکترهای دو بایتی استفاده کنید تا زمانی که یک کاراکتر باشد.

print('left  : {:*<10}'.format(100))
print('center: {:a^10}'.format(100))
print('right : {:鬼>10}'.format(100))
# left  : 100*******
# center: aaa100aaaa
# right : 鬼鬼鬼鬼鬼鬼鬼100

توجیه درست با > علامت (-،+) را در نظر نمی گیرد. اگر از = استفاده کنید، علامت با کاراکتر مشخص شده دنبال می شود. اگر می خواهید + را مشخص کنید، + بعد از = را بنویسید. جزئیات پردازش علامت در ادامه توضیح داده می شود.

print('sign: {:0>10}'.format(-100))
print('sign: {:0=10}'.format(-100))
print('sign: {:0=+10}'.format(100))
# sign: 000000-100
# sign: -000000100
# sign: +000000100

<، ^، و > می تواند برای رشته ها مشخص شود، اما = منجر به خطای ValueError می شود. اگر می خواهید برای یک رشته از = استفاده کنید، باید آن را با استفاده از int() به عدد تبدیل کنید.

# print('sign: {:0=10}'.format('-100'))
# ValueError: '=' alignment not allowed in string format specifier

print('sign: {:0=10}'.format(int('-100')))
# sign: -000000100

همین امر در مورد اعداد ممیز شناور نیز صدق می کند. امتیاز اعشاری نیز به عنوان یک کاراکتر محاسبه می شود.

print('left  : {:*<10}'.format(1.23))
print('center: {:a^10}'.format(1.23))
print('right : {:鬼>10}'.format(1.23))
# left  : 1.23******
# center: aaa1.23aaa
# right : 鬼鬼鬼鬼鬼鬼1.23

print('sign: {:0>10}'.format(-1.23))
print('sign: {:0=10}'.format(-1.23))
print('sign: {:0=+10}'.format(1.23))
# sign: 00000-1.23
# sign: -000001.23
# sign: +000001.23

لیست‌ها، تاپل‌ها و غیره در صورتی که همانطور که هست مشخص شوند باعث خطا می‌شوند و با استفاده از str() می‌توان آنها را به رشته تبدیل کرد.

l = [0, 1]
print(type(l))
# <class 'list'>

# print('{:*^16}'.format(l))
# TypeError: unsupported format string passed to list.__format__

print(type(str(l)))
# <class 'str'>

print('{:*^16}'.format(str(l)))
# *****[0, 1]*****

برای سمت چپ، توجیه مرکزی و راست، متدهای رشته اختصاصی به نام های ljust()، center() و rjust() نیز وجود دارد.

0 پر کردن

اگر می خواهید تعداد ارقام را با پر کردن صفر تنظیم کنید، کاراکتر مورد نظر را روی 0 تنظیم کنید و آن را به سمت راست توجیه کنید.

در مورد پر کردن صفر، اگر نماد تراز حذف شود، به گونه ای پردازش می شود که گویی = مشخص شده است.

print('zero padding: {:0=10}'.format(100))
print('zero padding: {:010}'.format(100))
# zero padding: 0000000100
# zero padding: 0000000100

print('zero padding: {:0=10}'.format(-100))
print('zero padding: {:010}'.format(-100))
# zero padding: -000000100
# zero padding: -000000100

#خطا!

# print('zero padding: {:010}'.format('-100'))
# ValueError: '=' alignment not allowed in string format specifier

برای پر کردن صفر، یک متد رشته اختصاصی به نام zfill() نیز وجود دارد.

علامت (بعلاوه یا منفی)

به طور پیش فرض، فقط اعداد منفی با علامت (منهای-) مشخص می شوند.

هنگامی که + به رشته مشخصات قالب بندی اضافه می شود، یک علامت (++) نیز برای اعداد مثبت نمایش داده می شود. اگر یک فاصله اضافه شود، یک فاصله در ابتدای عدد مثبت نمایش داده می شود و تعداد ارقام با عدد منفی تراز می شود.

print('sign: {}'.format(100))
print('sign: {}'.format(-100))
# sign: 100
# sign: -100

print('sign: {:+}'.format(100))
print('sign: {:+}'.format(-100))
# sign: +100
# sign: -100

print('sign: {: }'.format(100))
print('sign: {: }'.format(-100))
# sign:  100
# sign: -100

هنگام پر کردن با کاراکترهای دلخواه، مانند پر کردن صفر که در بالا ذکر شد، مراقب باشید. پیش فرض، بدون + و بدون فاصله، اعداد مثبت را با یک کاراکتر دیگر پر می کند.

print('sign: {:06}'.format(100))
print('sign: {:06}'.format(-100))
# sign: 000100
# sign: -00100

print('sign: {:+06}'.format(100))
print('sign: {:+06}'.format(-100))
# sign: +00100
# sign: -00100

print('sign: {: 06}'.format(100))
print('sign: {: 06}'.format(-100))
# sign:  00100
# sign: -00100

در صورت استفاده از نماد تراز، علامت تعیین علامت باید بعد از علامت تراز نوشته شود.

print('sign: {:_>6}'.format(100))
print('sign: {:_>6}'.format(-100))
# sign: ___100
# sign: __-100

print('sign: {:_>+6}'.format(100))
print('sign: {:_>+6}'.format(-100))
# sign: __+100
# sign: __-100

print('sign: {:_> 6}'.format(100))
print('sign: {:_> 6}'.format(-100))
# sign: __ 100
# sign: __-100

جداکننده رقم (کاما، خط زیر)

هر سه رقم یک کاما یا زیرخط _ جداکننده اضافه کنید. این کار خواندن اعداد بزرگ را آسان تر می کند. توجه داشته باشید که underscore_ گزینه ای است که در پایتون 3.6 اضافه شده است، بنابراین در نسخه های قبلی نمی توان از آن استفاده کرد.

print('{:,}'.format(100000000))
# 100,000,000

print('{:_}'.format(100000000))
# 100_000_000

در مورد انواع شناور اعداد ممیز شناور، فقط قسمت عدد صحیح محدود می شود.

print('{:,}'.format(1234.56789))
# 1,234.56789

اعداد باینری، اکتال و هگزادسیمال

مقادیر عددی را برای خروجی به اعداد باینری، اکتال و هگزادسیمال تبدیل می کند.

  • b: دودویی
  • o: هشتی
  • d: اعشاری
  • x،X: هگزادسیمال (حروف بزرگ بزرگ می شوند)
print('bin: {:b}'.format(255))
print('oct: {:o}'.format(255))
print('dec: {:d}'.format(255))
print('hex: {:x}'.format(255))
print('HEX: {:X}'.format(255))
# bin: 11111111
# oct: 377
# dec: 255
# hex: ff
# HEX: FF

همچنین می توان آن را با 0-fill ترکیب کرد و اغلب برای تراز کردن ارقام در نمادهای باینری و هگزا دسیمال استفاده می شود.

print('bin: {:08b}'.format(255))
print('oct: {:08o}'.format(255))
print('dec: {:08d}'.format(255))
print('hex: {:08x}'.format(255))
print('HEX: {:08X}'.format(255))
# bin: 11111111
# oct: 00000377
# dec: 00000255
# hex: 000000ff
# HEX: 000000FF

توجه داشته باشید که تعداد کاراکترهای صفر پر شده باید با در نظر گرفتن پیشوند مشخص شود.

print('bin: {:#010b}'.format(255))
print('oct: {:#010o}'.format(255))
print('dec: {:#010d}'.format(255))
print('hex: {:#010x}'.format(255))
print('HEX: {:#010X}'.format(255))
# bin: 0b11111111
# oct: 0o00000377
# dec: 0000000255
# hex: 0x000000ff
# HEX: 0X000000FF

برای اعداد باینری و هگزادسیمال، فقط می توان جداکننده اعداد زیرخط را وارد کرد (پایتون 3.6 یا بالاتر). جدا کننده 4 رقمی استفاده می شود. تعداد کاراکترهای پر شده با صفر باید تعداد زیرخط ها را نیز در نظر بگیرد.

print('hex: {:08x}'.format(255))
print('hex: {:09_x}'.format(255))
print('hex: {:#011_x}'.format(255))
# hex: 000000ff
# hex: 0000_00ff
# hex: 0x0000_00ff

فقط نوع عدد صحیح int می تواند فرمت را به باینری یا هگزادسیمال تبدیل کند. برای تبدیل آن به عدد می توانید از int() استفاده کنید.

# print('hex: {:08x}'.format('255'))
# ValueError: Unknown format code 'X' for object of type 'str'

print('hex: {:08x}'.format(int('255')))
# hex: 000000ff

تعداد ارقام بعد از اعشار را مشخص کنید

برای تعیین تعداد ارقام بعد از نقطه اعشار به صورت زیر عمل کنید: n تعداد ارقام است. تعداد ارقام بعد از نقطه اعشار بدون در نظر گرفتن تعداد ارقام در قسمت صحیح به تعداد ارقام مشخص شده تبدیل می شود.
.[n]f

print('{:.2f}'.format(123.456))
print('{:.5f}'.format(123.456))
print('{:.3f}'.format(0.0001234))
# 123.46
# 123.45600
# 0.000

سمت چپ نقطه اعشار را می‌توان به‌صورت توجیه‌شده چپ، توجیه‌شده در مرکز، توجیه‌شده راست یا پرشده با صفر مشخص کرد. اگر تعداد ارقام مقدار هدف بیشتر از عدد مشخص شده باشد، کاری انجام نمی شود. اگر تعداد ارقام در مقدار هدف بیشتر از تعداد ارقام مشخص شده باشد، هیچ کاری انجام نمی شود.

print('{:>12.5f}'.format(123.456))
print('{:012.5f}'.format(123.456))
print('{:06.5f}'.format(123.456))
#    123.45600
# 000123.45600
# 123.45600

اگر بعد از نقطه اعشار تعداد ارقام کمتر از تعداد ارقام اصلی را مشخص کنید، مقدار گرد می شود. توجه داشته باشید که این عدد به نزدیکترین عدد صحیح گرد نیست، بلکه به یک عدد زوج است، به عنوان مثال. 0.5 به 0 گرد می شود.

print('{:.0f}'.format(0.4))
print('{:.0f}'.format(0.5))
print('{:.0f}'.format(0.6))
# 0
# 0
# 1

اگر می خواهید از گرد کردن عمومی استفاده کنید، می توانید از روش quantize() اعشاری استاندارد کتابخانه استفاده کنید.

نماد نمایی

هنگامی که یک عدد شناور ممیز شناور به یک رشته رشته تبدیل می شود، بسته به تعداد ارقام، به طور خودکار به صورت نمایی نوشته می شود. نوع عدد صحیح int ندارد.

print('{}'.format(0.0001234))
print('{}'.format(0.00001234))
# 0.0001234
# 1.234e-05

print('{}'.format(1234000000000000.0))
print('{}'.format(12340000000000000.0))
print('{}'.format(12340000000000000000000000))
# 1234000000000000.0
# 1.234e+16
# 12340000000000000000000000

اگر e یا E را در رشته مشخصات قالب بندی مشخص کنید، همیشه می توانید به نماد نمایی تبدیل کنید. کاراکترهای استفاده شده در خروجی به ترتیب e و E خواهند بود.

print('{:e}'.format(0.0001234))
print('{:E}'.format(0.0001234))
# 1.234000e-04
# 1.234000E-04

همچنین امکان تعیین تعداد ارقام بعد از اعشار نیز وجود دارد. قسمت صحیح همیشه یک رقم و نقطه اعشار تعداد ارقام مشخص شده خواهد بود.

print('{:.5e}'.format(0.0001234))
print('{:.2E}'.format(0.0001234))
# 1.23400e-04
# 1.23E-04

print('{:.5e}'.format(987.65))
print('{:.2E}'.format(987.65))
# 9.87650e+02
# 9.88E+02

توجه داشته باشید که اگر سمت چپ، توجیه مرکزی، توجیه راست و یا صفر پر شده را مشخص کنید، e-، E+ و غیره نیز به عنوان ارقام (نویسه) شمرده می شوند.

print('{:>12.5e}'.format(987.65))
print('{:012.2E}'.format(987.65))
#  9.87650e+02
# 00009.88E+02

ارقام مهم (تعداد ارقام قابل توجه)

با انجام موارد زیر می توانید تعداد کلی ارقام را مشخص کنید. بسته به نتیجه، نماد نمایی به طور خودکار استفاده می شود. توجه داشته باشید که صفرهای پس از اعشار حذف می شوند.
.[n]g

print('{:.2g}'.format(123.456))
print('{:.3g}'.format(123.456))
print('{:.8g}'.format(123.456))
print('{:.3g}'.format(0.0001234))
# 1.2e+02
# 123
# 123.456
# 0.000123

اگر g را حذف کنید، خروجی یک عدد صحیح نخواهد بود. g در بیشتر موارد یکسان است، اما فقط در مواردی که خروجی یک عدد صحیح است.

print('{:.2}'.format(123.456))
print('{:.3}'.format(123.456))
print('{:.8}'.format(123.456))
print('{:.3}'.format(0.0001234))
# 1.2e+02
# 1.23e+02
# 123.456
# 0.000123

اگر همان مقدار را پردازش کنیم، به ترتیب زیر را دریافت می کنیم.

print('{:.3f}'.format(123.456))
print('{:.3e}'.format(123.456))
print('{:.3g}'.format(123.456))
print('{:.3}'.format(123.456))
# 123.456
# 1.235e+02
# 123
# 1.23e+02

print('{:.8f}'.format(123.456))
print('{:.8e}'.format(123.456))
print('{:.8g}'.format(123.456))
print('{:.8}'.format(123.456))
# 123.45600000
# 1.23456000e+02
# 123.456
# 123.456

در مورد g یا اگر حذف شود، صفرهای انتهایی بعد از نقطه اعشار حذف می شوند، بنابراین اگر می خواهید همان تعداد ارقام معنی دار (تعداد ارقام معنی دار) را به دست آورید، از نماد نمایی e یا E استفاده کنید. قسمت صحیح همیشه یک رقم و نقطه اعشار تعداد مشخص شده ارقام است، بنابراین اگر می خواهید n رقم قابل توجه خروجی بگیرید، فقط n-1 را مشخص کنید.

print('{:.4e}'.format(123.456))
print('{:.4e}'.format(0.000012345))
print('{:.4e}'.format(12))
# 1.2346e+02
# 1.2345e-05
# 1.2000e+01

نمایش درصد

اگر % در رشته مشخصات قالب بندی مشخص شده باشد، مقدار float یا int عددی در 100 ضرب می شود و به رشته ای با % تبدیل می شود.

همچنین امکان تعیین تعداد ارقام بعد از اعشار نیز وجود دارد. پیش فرض شش رقم بعد از نقطه اعشار است. Left-Justify، Center-Justify، Just Justify و Zero-fill نیز موجود است. % نیز به عنوان یک کاراکتر محاسبه می شود.

print('{:%}'.format(0.12345))
print('{:.2%}'.format(0.12345))
# 12.345000%
# 12.35%

print('{:%}'.format(10))
print('{:.2%}'.format(10))
# 1000.000000%
# 1000.00%

print('{:>7.2%}'.format(0.12345))
print('{:07.2%}'.format(0.12345))
#  12.35%
# 012.35%
Copied title and URL