تحويل التنسيق في Python ، التنسيق (تعبئة صفرية ، تدوين أسي ، سداسي عشري ، إلخ.)

اعمال

لتحويل (تنسيق) رقم أو سلسلة إلى تنسيقات مختلفة في Python ، استخدم تنسيق الوظيفة المضمنة () أو طريقة السلسلة str.format ().

سنشرح في هذا القسم كيفية استخدام الوظائف التالية.

  • وظيفة مدمجة (على سبيل المثال في لغة البرمجة)format()
  • طريقة السلسلةstr.format()

بالإضافة إلى ذلك ، يتم شرح سلسلة مواصفات التنسيق للتحويل إلى التنسيق التالي بنموذج التعليمات البرمجية.

  • مبرر لليسار ، مبرر للوسط ، مبرر لليمين
  • ملء الصفر
  • علامة (زائد أو ناقص)
  • فاصل الأرقام (فاصلة ، شرطة سفلية)
  • الأعداد الثنائية والثمانية والسداسية العشرية
  • حدد عدد الأرقام بعد الفاصلة العشرية
  • أرقام ذات دلالة (عدد الخانات ذات الدلالة)
  • الأسية
  • عرض النسبة المئوية

لاحظ أنه منذ Python 3.6 ، تمت إضافة سلاسل f (سلاسل f) إلى طريقة السلسلة str.format () لجعلها أكثر إيجازًا.

وظيفة مدمجة: تنسيق ()

يتم توفير format () كوظيفة مضمنة قياسية في Python.

المخطط على النحو التالي.

  • format(value, format_spec)
    • الحجة الأولى:value
      القيمة الأصلية. سلسلة سلسلة ، رقم int ، عدد عشري ، إلخ.
    • الحجة الثانيةformat_spec
      سلسلة مواصفات التنسيق. سلسلة سلسلة
    • قيمة الإرجاع: سلسلة سلسلة منسقة

يتم عرض الأمثلة أدناه. يتم وصف أنواع سلاسل التنسيق وكيفية كتابتها لاحقًا.

في هذا المثال ، استخدمنا القيم الحرفية الرقمية والسلسلة الحرفية كأول وسيطة ، ولكن بالطبع يمكنك استخدام المتغيرات التي تحتوي على هذه القيم.

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

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

أسلوب السلسلة str.format ()

هناك أيضًا طريقة format () لنوع السلسلة 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

التبرير الصحيح مع & GT. لا تأخذ في الاعتبار علامة (- ، +). إذا كنت تستخدم = ، فإن العلامة متبوعة بالحرف المحدد. إذا كنت تريد تحديد + ، فاكتب + بعد =. يتم وصف تفاصيل معالجة التوقيع لاحقًا.

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

العلامة & lt ؛، ^ و & GT. يمكن تحديدها للسلاسل ، ولكن = سينتج عن خطأ 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

فاصل الأرقام (فاصلة ، شرطة سفلية)

أضف فاصلة أو شرطة سفلية _ فاصل كل ثلاثة أرقام. هذا يجعل الأعداد الكبيرة أسهل في القراءة. لاحظ أن التسطير السفلي هو خيار مضاف في Python 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-تعبئة ، وغالبًا ما يستخدم لمحاذاة الأرقام في تدوين ثنائي وسداسي عشري.

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

بالنسبة للأرقام الثنائية والسداسية العشرية ، يمكن فقط إدخال فاصل الخانات السفلية _ (Python 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 () من العشرية القياسية للمكتبة.

الأسية

عندما يتم تحويل رقم عائم ذو فاصلة عائمة إلى سلسلة سلسلة ، فإنه سيتم كتابته تلقائيًا بالتدوين الأسي اعتمادًا على عدد الأرقام. نوع صحيح لا.

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

عرض النسبة المئوية

إذا تم تحديد٪ في سلسلة مواصفات التنسيق ، يتم ضرب قيمة العدد الرقمي أو int في 100 ويتم تحويلها إلى سلسلة مع٪.

من الممكن أيضًا تحديد عدد الأرقام بعد الفاصلة العشرية. الرقم الافتراضي هو ستة أرقام بعد الفاصلة العشرية. اليسار تبرير، الوسط تبرير انقر بزر الماوس الأيمن تبرير، وعدم ملء وتتوفر أيضا. يتم احتساب النسبة المئوية أيضًا كحرف.

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%