کتابخانه‌ی استاندارد · پایه

قالب بندی fmt

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

واردسازی قالب بندی

نام آرگومان‌ها شناسه‌ی خود کد است و معادل فارسی ندارد؛ گونه‌ها، کلیدواژه‌ها و نام بسته‌ها با معادل فارسی نوشته می‌شوند.

وقتی می‌خواهید خروجی مرتب و خوانا بسازید، بسته‌ی قالب بندی به کارتان می‌آید. با آن عددها را به متن تبدیل می‌کنید، متن را در ستون‌هایی با پهنای ثابت می‌چینید و جمله‌ها را از یک قالب می‌سازید.

قالب‌ها ساده‌اند: هر {} در قالب با عضو بعدی وکتور مقدارها پر می‌شود. چون مقدارها رشته‌اند، عددها را پیش از آن با تابع‌هایی مثل عدد صحیح به متن تبدیل کنید.

اگر با printf یا Go آشنایید، به این‌ها دقت کنید:

  • نشانه‌هایی مثل %d یا {:.2} وجود ندارد. جای خالی همیشه یک {} ساده است؛ پهنا و تعداد رقم اعشار را با قالب‌بندی خود مقدار، پیش از گذاشتن در قالب، تعیین کنید، مثلاً با پرکردن چپ یا عدد اعشار با دقت.
  • نمی‌توان خود {} را در متن قالب نوشت، چون راهی برای گریز از آن نیست.
  • شانزده و عدد بی علامت مقدار طبیعی۶۴ می‌گیرند؛ پس عدد صحیح را باید تبدیل کرد: قالب بندی.شانزده(n برگردان طبیعی۶۴).

چاپ یک جدول

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

fmt-guide-receipt.salam
واردسازی قالب بندی

ساختار خرید:
    همگانی نام: رشته = ""
    همگانی تعداد: صحیح = ۰
    همگانی قیمت: اعشار۶۴ = ۰.۰
پایان

تابع ردیف(الف: رشته، ب: رشته، پ: رشته): رشته:
    برگشت قالب بندی.پرکردن راست(الف، ۱۲) + قالب بندی.پرکردن چپ(ب، ۵) + قالب بندی.پرکردن چپ(پ، ۱۰)
پایان

تابع ریشه:
    اقلام := [خرید { نام = "قهوه"، تعداد = ۲، قیمت = ۳.۵ }، خرید { نام = "کروسان"، تعداد = ۳، قیمت = ۲.۲۵ }، خرید { نام = "آب"، تعداد = ۱، قیمت = ۱.۰ }]
    سرچاپ "|" + قالب بندی.وسط چین("رسید خرید"، ۲۵) + "|"
    سرچاپ ردیف("کالا"، "تعداد"، "مبلغ")
    ناپایا جمع := ۰.۰
    هر قلم در اقلام:
        مبلغ := قلم.قیمت * قلم.تعداد
        جمع += مبلغ
        سرچاپ ردیف(قلم.نام، قالب بندی.عدد صحیح(قلم.تعداد)، قالب بندی.عدد اعشار با دقت(مبلغ، ۲))
    پایان
    سرچاپ ردیف("جمع"، ""، قالب بندی.عدد اعشار با دقت(جمع، ۲))
پایان
خروجی| رسید خرید | کالا تعداد مبلغ قهوه 2 7.00 کروسان 3 6.75 آب 1 1.00 جمع 14.75

مبلغ‌ها با عدد اعشار با دقت و دو رقم اعشار چاپ می‌شوند، پس 7 به شکل 7.00 درمی‌آید و همه‌ی مبلغ‌ها هم‌پهنا می‌شوند. پهنا بر حسب حرف شمرده می‌شود، نه بایت، پس نام‌های فارسی هم درست هم‌تراز می‌شوند. مقداری که از ستونش بلندتر باشد هیچ‌وقت بریده نمی‌شود، فقط بقیه‌ی ردیف را جلوتر می‌برد؛ پهناها را به اندازه‌ی بلندترین مقدارتان انتخاب کنید.

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

پر کردن قالب یک پیام

قالب رشته هر {} را با رشته‌ی بعدیِ یک وکتور پر می‌کند. نگه داشتن جمله در یک قالب، به‌جای زنجیره‌ای بلند از +، خواندن و تغییر دادنش را آسان می‌کند و می‌شود بعداً قالب را با ترجمه‌اش عوض کرد. عدد و مقدار منطقی اول با عدد صحیح، عدد اعشار یا منطقی به متن تبدیل می‌شوند، چون همه‌ی مقدارها رشته‌اند.

fmt-guide-messages.salam
واردسازی قالب بندی

ساختار سفارش:
    همگانی مشتری: رشته = ""
    همگانی شماره: صحیح = ۰
    همگانی پرداخت شده: منطقی = نادرست
پایان

تابع پیام سفارش(س: سفارش): رشته:
    ناپایا مقدارها := وکتور {} برگردان وکتور<رشته>
    دیرکن مقدارها.آزادکن()
    مقدارها.بیفزا(س.مشتری)
    مقدارها.بیفزا(قالب بندی.عدد صحیح(س.شماره))
    مقدارها.بیفزا(س.پرداخت شده ? "پرداخت شده" : "در انتظار پرداخت")
    برگشت قالب بندی.قالب رشته("{} عزیز، سفارش {} {} است."، مقدارها)
پایان

تابع ریشه:
    سرچاپ پیام سفارش(سفارش { مشتری = "نیما"، شماره = ۱۰۴۲، پرداخت شده = درست })
    سرچاپ پیام سفارش(سفارش { مشتری = "لیلا"، شماره = ۱۰۴۳ })
پایان
خروجینیما عزیز، سفارش 1042 پرداخت شده است. لیلا عزیز، سفارش 1043 در انتظار پرداخت است.

وکتور مقدارها مال شماست، پس وقتی پیام ساخته شد آزادش کنید. اگر نتیجه باید به پرونده برود نه به یک رشته، قالب نوشتن همان قالب و مقدارها را می‌گیرد و در یک پرونده* باز می‌نویسد.

خروجی مبنای شانزده

شانزده عدد را در مبنای شانزده با حروف کوچک و بدون 0x می‌نویسد و صفر پیشرو نمی‌گذارد. قالب‌هایی با پهنای ثابت، مثل رنگ CSS که هر کانالش دقیقاً دو رقم است، باید آن صفر را خودشان اضافه کنند.

fmt-guide-colors.salam
واردسازی قالب بندی

تابع دو رقم شانزده(ع: صحیح): رشته:
    ش := قالب بندی.شانزده(ع برگردان طبیعی۶۴)
    اگر ش.طول() < ۲:
        برگشت "0" + ش
    پایان
    برگشت ش
پایان

تابع رنگ وب(سرخ: صحیح، سبز: صحیح، آبی: صحیح): رشته:
    برگشت "#" + دو رقم شانزده(سرخ) + دو رقم شانزده(سبز) + دو رقم شانزده(آبی)
پایان

تابع ریشه:
    سرچاپ رنگ وب(۲۵۵، ۱۶۵، ۰)
    سرچاپ رنگ وب(۰، ۱۲۸، ۱۲۸)
    سرچاپ رنگ وب(۹، ۹، ۹)
    ناپایا روشنی := ۰
    تا روشنی <= ۲۵۵:
        سرچاپ قالب بندی.پرکردن چپ(قالب بندی.عدد صحیح(روشنی)، ۳)، رنگ وب(روشنی، روشنی، روشنی)
        روشنی += ۸۵
    پایان
پایان
خروجی#ffa500 #008080 #090909 0 #000000 85 #555555 170 #aaaaaa 255 #ffffff

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

کدام تابع برای کدام کار

کارتابع
عدد صحیح به متنعدد صحیح، یا عدد بی علامت برای طبیعی۶۴
عدد اعشاری در کوتاه‌ترین شکلعدد اعشار
عدد اعشاری با تعداد رقم اعشار ثابتعدد اعشار با دقت
هم‌ترازی متن در ستونپرکردن راست (هم‌ترازی از ابتدا)، پرکردن چپ (از انتها)، وسط چین
جمله‌ای با مقدارهایی در آنقالب رشته، یا قالب نوشتن برای نوشتن در پرونده
مبنای شانزدهشانزده

برای تبدیل متن به عدد، صفحه‌ی تبدیل را ببینید. برای قالب‌هایی با نام، حلقه و شرط، مثل صفحه‌ی HTML یا ایمیل، از قالب استفاده کنید.

تابع‌ها

عدد صحیح Int

تابع عدد صحیح(i: صحیح۶۴): رشته
یک عدد صحیح را به متن تبدیل می‌کند، با علامت منفی اگر لازم باشد.
fmt-Int.salam
واردسازی قالب بندی

تابع ریشه:
    سرچاپ "[" + قالب بندی.عدد صحیح(-۴۲) + "]"
    سرچاپ "[" + قالب بندی.عدد بی علامت(۴۲ برگردان طبیعی۶۴) + "]"
    سرچاپ "[" + قالب بندی.عدد اعشار(۳.۲۵) + "]"
    سرچاپ "[" + قالب بندی.عدد اعشار با دقت(۳.۱۴۱۵۹، ۲) + "]"
    سرچاپ "[" + قالب بندی.منطقی(درست) + "]"
    سرچاپ "[" + قالب بندی.شانزده(۲۵۵ برگردان طبیعی۶۴) + "]"
پایان
خروجی[-42] [42] [3.25] [3.14] [true] [ff]

عدد اعشار Float

تابع عدد اعشار(f: اعشار۶۴): رشته
یک عدد اعشاری را به کوتاه‌ترین متنی تبدیل می‌کند که دوباره همان عدد خوانده شود: 1.0 می‌شود 1، 0.1 همان 0.1 می‌ماند و 1.0 / 3.0 می‌شود 0.3333333333333333. عددهای خیلی بزرگ یا خیلی کوچک با توان نوشته می‌شوند، مثل 1e+21. اگر تعداد رقم اعشار باید ثابت باشد، عدد اعشار با دقت را به کار ببرید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fmt-Int.salam

منطقی Bool

تابع منطقی(b: منطقی): رشته
مقدار منطقی را به "true" یا "false" تبدیل می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fmt-Int.salam

پرکردن چپ PadLeft

تابع پرکردن چپ(s: رشته، width: صحیح): رشته
اگر متن از width کوتاه‌تر باشد، سمت چپش فاصله می‌گذارد تا به آن پهنا برسد. پهنا بر حسب حرف شمرده می‌شود، پس برای متن فارسی هم درست کار می‌کند. در ستون عددها، این تابع عددها را از راست هم‌تراز می‌کند.
fmt-PadLeft.salam
واردسازی قالب بندی

تابع ریشه:
    سرچاپ "[" + قالب بندی.پرکردن چپ("42"، ۶) + "]"
    سرچاپ "[" + قالب بندی.پرکردن راست("42"، ۶) + "]"
    سرچاپ "[" + قالب بندی.وسط چین("42"، ۶) + "]"
    سرچاپ "[" + قالب بندی.پرکردن چپ("سلام"، ۱۰) + "]"
پایان
خروجی[ 42] [42 ] [ 42 ] [ سلام]

پرکردن راست PadRight

تابع پرکردن راست(s: رشته، width: صحیح): رشته
مثل پرکردن چپ، ولی فاصله‌ها را سمت راست متن می‌گذارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fmt-PadLeft.salam

وسط چین Center

تابع وسط چین(s: رشته، width: صحیح): رشته
متن را وسط پهنای داده‌شده می‌گذارد. اگر فاصله‌ها زوج نباشند، یک فاصله‌ی اضافه سمت راست می‌رود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fmt-PadLeft.salam

قالب رشته Sprintf

تابع قالب رشته(tmpl: رشته، args: وکتور<رشته>): رشته
قالب را برمی‌دارد و هر {} را به‌ترتیب با عضوهای وکتور args پر می‌کند. اگر مقدار کم بیاید، جای خالی‌ها تهی می‌مانند و مقدارهای اضافه نادیده گرفته می‌شوند.
fmt-Sprintf.salam
واردسازی قالب بندی

تابع ریشه:
    ناپایا مقدارها := وکتور {} برگردان وکتور<رشته>
    دیرکن مقدارها.آزادکن()
    مقدارها.بیفزا("سارا")
    مقدارها.بیفزا(قالب بندی.عدد صحیح(۱۹))
    سرچاپ قالب بندی.قالب رشته("{} نمره‌ی {} گرفت."، مقدارها)
پایان
خروجیسارا نمره‌ی 19 گرفت.

قالب نوشتن Fprintf

تابع قالب نوشتن(f: پرونده*، tmpl: رشته، args: وکتور<رشته>): صحیح
مثل قالب رشته، ولی نتیجه را مستقیم در پرونده‌ی باز می‌نویسد و تعداد بایت‌های نوشته‌شده را برمی‌گرداند.
fmt-Fprintf.salam
واردسازی قالب بندی
واردسازی ورودی خروجی
واردسازی سیستم عامل

تابع ریشه:
    ناپایا مقدارها := وکتور {} برگردان وکتور<رشته>
    دیرکن مقدارها.آزادکن()
    مقدارها.بیفزا("۲۵")
    پ := سیستم عامل.بازکردن("دما.txt"، "wb")
    قالب بندی.قالب نوشتن(پ، "دمای امروز {} درجه است\n"، مقدارها)
    ورودی خروجی.بستن(پ)
    چاپ ورودی خروجی.خواندن پرونده("دما.txt")
پایان
خروجیدمای امروز ۲۵ درجه است

عدد اعشار با دقت FloatPrec

تابع عدد اعشار با دقت(f: اعشار۶۴، prec: صحیح): رشته
عدد اعشاری را با تعداد رقم اعشار دلخواه به متن تبدیل می‌کند. نیمه‌ها مثل حساب روی کاغذ از صفر دور گرد می‌شوند: 2.675 با دو رقم 2.68 می‌شود و -1.5 بدون رقم اعشار -2.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fmt-Int.salam

عدد بی علامت Uint

تابع عدد بی علامت(u: طبیعی۶۴): رشته
یک عدد بدون علامت ۶۴ بیتی را به متن تبدیل می‌کند؛ برای عددهای خیلی بزرگ که در صحیح۶۴ جا نمی‌شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fmt-Int.salam

شانزده Hex

تابع شانزده(u: طبیعی۶۴): رشته
عدد را در مبنای شانزده با حروف کوچک می‌نویسد، بدون پیشوند 0x و بدون صفرهای آغازی. ورودی‌اش طبیعی۶۴ است، پس عدد صحیح را با برگردان طبیعی۶۴ تبدیل کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fmt-Int.salam