در C#/.NET دو سازوکار اصلی برای قالببندی رشتهها وجود دارد: استفاده از String.Format() و درج رشته.
String.Format() یک رشته و تعدادی آرگومان متغیر میگیرد؛ رشتهای (که در مستندات «قالب ترکیبی» نامیده میشود) شامل متن ثابت و جانگهدارهایی (که در مستندات موارد قالب شناخته میشوند). مقدار بازگشتی هر مورد قالب را با آرگومان متناظرش جایگزین میکند و مقادیر جایگزینشده را با متن ثابت ترکیب میکند.
string.Format("I had {0} bitcoins on {1}, the day I forgot my password.", 55.5, new DateTime(2010, 2, 25));
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings
این سازوکار از نظر فنی «قالببندی ترکیبی» نامیده میشود.
رشتههای درجشده با یک $ آغاز میشوند و عبارتهای زمان اجرا را در آکولاد در بر میگیرند. مورد قالب نحوهی نگارش زیر را دارد: $"{<interpolationExpression>}". این رشتهها نیاز به فهرست جداگانهای از آرگومانها را از میان برمیدارند. نتیجه از نظر عملکردی با سازوکار String.Format() همارز است.
var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf} bitcoins on {thatDay}, the day I forgot my password."
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings
متنی که داخل آکولادها میآید، چه جانگهدار در قالب ترکیبی باشد و چه عبارت درجشده در درج رشته، مورد قالب نامیده میشود.
یک مورد قالب میتواند حداکثر از ۳ بخش تشکیل شود. بخش اول، عبارت یا جانگهدار آرگومان اجباری است که در کد نمونهی بالا دیدید. علاوه بر آن، یک ترازبندی اختیاری (که با کاما «,» معرفی میشود) و یک رشتهی قالب اختیاری (که با دو نقطه «:» معرفی میشود) هم وجود دارد.
{<interpolationExpression>[,<alignment>][:<formatString>]}
ترازبندی طول «میدان»ی را مشخص میکند که متن در آن قرار میگیرد؛ اگر ترازبندی مثبت باشد، متن با فاصله در سمت چپ و اگر منفی باشد، در سمت راست پر میشود.
رشتهی قالب شکل متن خروجی را مشخص میکند؛ مثلاً اینکه برای یک عدد جداکنندهی هزارگان درج شود یا نه، یا اینکه فقط بخش تاریخِ یک شیء DateTime خروجی گرفته شود.
کد زیر نمایش بخش تاریخِ یک شیء DateTime و یک عدد اعشاری را به شکل نمایی نشان میدهد.
var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf:E} bitcoins on {thatDay:d}, the day I forgot my password."
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings
string.Format(
"I had {0:E} bitcoins on {1:d}, the day I forgot my password.",
loadsOf, thatDay)
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings
برای اعداد و تاریخها هر دو، هم قالببندی استاندارد و هم قالببندی سفارشی وجود دارد. تفاوت مهمی میان سفارشی و استاندارد نیست؛ فقط این که میتوانید رشتههای قالب سفارشی را از حروف قالب بسازید.
هر thread یک فرهنگ پیشفرض دارد: Thread.CurrentThread.CurrentCulture که در نمونهای از CultureInfo جای گرفته است. فرهنگ thread تعیین میکند که تاریخها و اعداد با توجه به تفاوتهای منطقهای چگونه قالببندی شوند؛ مثلاً تفاوت قالب رایج تاریخ میان بریتانیا (DD/MM/YYYY) و ایالات متحده (MM/DD/YYYY).
CultureInfo رابط IFormatProvider را پیادهسازی میکند که میتوان آن را به برخی از سربارگذاریهای String.Format() فرستاد. از این کار میتوان برای بازنویسی فرهنگ thread استفاده کرد.
رشتههای واژهبهواژه امکان نوشتن رشتههای چندخطی را فراهم میکنند. این رشتهها با @ معرفی میشوند.
string str = @"
See no wretched
quotes everywhere
";
در این تمرین، به دلدادههای دبیرستانی کمک میکنید تا عشقشان را در شبکههای اجتماعی اعلام کنند.
لطفاً متد ایستای HighSchoolSweethearts.DisplaySingleLine() را پیادهسازی کنید تا دو اسم بگیرد و آنها را با یک قلب از هم جدا کرده نمایش دهد.
متن قالببندیشده باید ۶۱ نویسه پهنا داشته باشد و قلب در مرکز رشته قرار بگیرد.
تضمین میشود که همهی اسمها بهراحتی در پهنای خط جا میشوند.
HighSchoolSweethearts.DisplaySingleLine("Lance Green", "Pat Riley");
// => " Lance Green ♡ Pat Riley "
متد ایستای HighSchoolSweethearts.DisplayBanner() را پیادهسازی کنید که دو مجموعه حروف اول را با علامت جمع از هم جدا کرده نمایش میدهد.
HighSchoolSweethearts.DisplayBanner("L. G.", "P. R.");
// see the ascii art below
****** ******
** ** ** **
** ** ** **
** * **
** **
** L. G. + P. R. **
** **
** **
** **
** **
** **
** **
***
*
متد ایستای HighSchoolSweethearts.DisplayGermanExchangeStudents() را پیادهسازی کنید تا تاریخ شروع رابطه و مدتزمان آن را برای دانشآموزان تبادلی آلمانی ما نمایش دهد.
HighSchoolSweethearts.DisplayGermanExchangeStudents("Norbert", "Heidi", new DateTime(2019, 1, 22), 1535.22f);
// => "Norbert and Heidi have been dating since 22.01.2019 - that's 1.535,22 hours"