قالب بندی رشته ها

دات نت، جهت قالب بندی رشته و نحوه نمایش آنها در خروجی راه‌های متعددی در اختیار شما قرار می‌دهد. شما می‌توانید با استفاده از ()String.Format رشته‌ها را به روشهای مختلفی قالب بندی کنید.

string str1 = "This";
string str2 = "That";
string str3 = String.Format("{0} and {1}", "This", "That");

Console.WriteLine(str3);
This and That

()String.Format متدی است که یک رشته شامل قالب بندی خاص ({1} و {0}) را قبول می‌کند به دنبال این رشته، رشته‌ای که قرار است قالب بندی شود می‌آید. کامپایلر به اعداد رشته‌ای که دارای قالب بندی خاص است (“{0} and {1}”) نگاه می‌کند و آرگومان معادل را جایگزین این اعداد می‌کند. مثلاً در مثال بالا رشته This جایگزین عدد 0 و رشته That جایگزین عدد 1 می‌شود. به این نکته توجه کنید که ()String.Format کاملاً شبیه متد ()Console.WriteLine است.

در حقیقت Console.WriteLine با همان تکنیکی که در بالا توضیح داده شد به کار می‌رود. از آنجاییکه علائم { و } برای نشان دادن شروع و پایان رشته قالب بندی به کار می‌روند پس چگونه این علائم را می‌توان در خروجی نمایش داد؟

Console.WriteLine("{{{0}}}", 7);
{7}

برای نمایش هر کدام از این علائم کافیست آن‌ها را در بین دو آکولاد مانند بالا قرار دهید. به کد بالا توجه کنید، مشاهده می‌کنید که عدد صفر نشان دهنده اولین آرگومان بعد از رشته با قالب بندی خاص یعنی عدد 7 است. در نتیجه عدد 7 همراه با آکولاد در خروجی چاپ می‌شود. به این نکته توجه کنید که عدد 0 در رشته با قالب بندی خاص نشان دهنده اولین آرگومان، عدد 1 نشان دهنده دومین آرگومان و … بعد از این رشته خاص می‌باشد. به مثال زیر توجه کنید :

Console.WriteLine("{0} , {1} , {2}","One",5,"seven");
One , 5 , seven

در مثال بالا رشته با قالب خاص “{0} , {1} , {2}” می‌باشد. عدد 0 در مثال بالا عدد 0 با رشته “One” و عدد 1 با عدد 5 و عدد 2 با رشته “seven” جایگزین می‌شود. یک آرگومان را بیشتر از یک بار می‌توان در خروجی چاپ کرد. به مثال زیر توجه کنید :

Console.WriteLine("{0} {0} {0} {1} {1}", "hello", "world");
hello hello hello world world

قالب بندی اعداد

می‌توان اعداد را نیز با فرمت‌های خاصی قالب بندی کرد :

Console.WriteLine("{0:C}", 500);
$500.00

همانطور که می‌بینید می‌توان عدد صحیح 500 را با استفاده از C: به حالت پولی در آورد. برای این کار می‌توان از فرمت “{0:C}” استفاده کرد. برای اعشاری کردن عدد 500 هم می‌توان از فرمت “{0:F3}” به صورت زیر استفاده کرد:

Console.WriteLine("{0:F3}", 500);// 500.000

همانطور که می‌بینید، فرمت “{0:F3}” سه رقم اعشار به عدد 500 اضافه می‌کند. برای اعمال دو رقم اعشار کافیست عدد 3 را به 2 تغییر دهید. در جدول زیر لیستی از فرمت‌های مشخص (format specifiers) برای قالب بندی اعداد آمده است :

Specifier Format
C مقدار پولی خاص یک محل
D انواع صحیح (integer)
E نماد علمی
F نقطه اعشار ثابت
G اعداد عمومی
N نقطه اعشار ثابت با جدا کننده کاما
P اعداد دارای درصد
X هگزادسیمال

تأثیر دقت یک قالب خاص بستگی به تنظیمات منطقه‌ای دارد. به عنوان مثال قالب پولی C، به طور خودکار قالب پولی منطقه انتخاب شده را نشان می‌دهد. برای اکثر کاربران این اطلاعات به طور پیشفرض مربوط به منطقه و زبان آن‌ها می‌باشد. در برنامه زیر چندین قالب عددی نشان داده شده است :

double v = 17688.65849;
double v2 = 0.15;
int x = 21;

Console.WriteLine("{0:F2}", v); // 17688.66
Console.WriteLine("{0:N5}", v); // 17, 688.65849
Console.WriteLine("{0:e}", v);  // 1.768866e+004
Console.WriteLine("{0:r}", v);  // 17688.65849
Console.WriteLine("{0:p}", v2); // 15.00 %
Console.WriteLine("{0:X}", x);  // 15
Console.WriteLine("{0:D12}", x);  // 000000000021
Console.WriteLine("{0:C}", 189.99); // $189.99

به تأثیر اعشار در قالب‌های مختلف توجه کنید. به این نکته هم توجه کنید که با استفاده از متد ToString() هم می‌توان قالب بندی عددی اعمال کرد.

int x = 500;
Console.WriteLine(x.ToString("C")); // $500.00

فاصله خالی دادن با قالب‌ها

با استفاده از قالب‌های مشخصی می‌توان فاصله‌هایی به چپ و راست رشته‌ها اضافه کرد. به مثال زیر توجه کنید :

Console.WriteLine("{0,10}", "hello"); 
Console.WriteLine("{0,-10}{1}", "hello", "world");
     hello
hello     world

همانطور که مشاهده می‌کنید در مثال بالا از قالب {x:y} استفاده شده است که در آن x آرگومان عددی و به معنای رشته مورد نظر ما و y طول فاصله است. مثلاً در خط دوم کد بالا {0,-10}{1} یعنی بعد از رشته Hello که عدد 0 نماینده آنست و قبل از رشته World که عدد 1 نماینده آن است 10 فضای خالی قرار بده. طول مثبت فاصله را به سمت چپ و طول منفی فاصله را به سمت راست رشته اضافه می‌کند. مقدار فاصله‌ها به طول رشته‌ها بستگی دارد. به عنوان مثال، اگر طول یک رشته 5 باشد و طول فاصله‌ها 10، آنگاه فضای خالی که به سمت راست یا چپ رشته اعمال می‌شود 5 فاصله است. یعنی طول رشته منهای طول فاصله. پس در نتیجه اگر طول فاصله کمتر از طول رشته باشد هیچ فضای خالی به سمت چپ یا راست اعمال نمی‌شود. می‌توانید قالب بندی عددی را با قالب بندی فاصله ترکیب کنید :

Console.WriteLine("{0,10:C}", 500);
    $500.00

به نکته‌ای در مورد مثال بالا توجه کنید که ما 10 فضای خالی برای قالب بندی تعیین کرده‌ایم و در نتیجه چون طول عدد 500، سه است، باید 7 فاصله در سمت چپ آن اضافه شود ولی چون علامت $ هم یک فضا را اشغال کرده است و همچنین 2 عدد اعشار هم به عدد اضافه می‌کند به جای 7 فاصله با احتساب ممیز 3 فاصله خالی در سمت چپ عدد 500 قرار می‌گیرد.

قالب بندی سفارشی اعداد

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

کاراکتر معنی
# عدد
. اعشار
, جدا کننده سه رقمی
% درصد
0 اضافه کردن صفر
; اعداد مثبت، منفی و مقادیر صفر را با قالب‌های خاصی نمایش می‌دهد.
E0 E+0 E-0
e0 e+0 e-0
نماد علمی

نقطه، مکان اعشار را مشخص می‌کند. علامت # می‌تواند در برگیرنده عددی باشد که قرار است در سمت چپ یا راست آن اعشار قرار بگیرد. اگر این علامت در سمت راست اعشار قرار بگیرد، دقت اعشار را مشخص می‌کند و ممکن است در صورت لزوم عدد را رند کند و اگر در سمت چپ ممیز باشد نماینده قسمت صحیح عدد می‌باشد. اگر طول عدد از تعداد علامتهای # که در سمت چپ علامت اعشار قرار دارند بیشتر باشد، کل عدد نشان داده می‌شود. به عنوان مثال اگر عدد مورد نظر شما 12345 باشد و شما از سه علامت ### قبل از ممیز استفاده کرده باشید همه عدد نشان داده می‌شود. اگر مقدار اصلی دارای اعشار باشد و شما در قالب بندی قسمت اعشار را قالب بندی نکنید، عدد اصلی رند می‌شود. به عنوان مثال اگر مقدار اصلی 123.45 باشد و شما از ### استفاده کنید عدد 123 نمایش داده می‌شود. برای قرار دادن صفر قبل از علامت اعشار (قبل از عدد) و یا بعد از قسمت اعشار باید از کاراکتر 0 به صورت زیر استفاده کنید :

Console.WriteLine("{0:00##.#00}", 21.3); // 0021.300

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

Console.WriteLine("{0:#,###.#}", 3421.3); // 3,421.3

لازم نیست که مکان کاما را برای همه قسمت‌ها مشخص کنید چون خودش به صورت خودکار سه رقم سه رقم جدا می‌کند مثلاً :

Console.WriteLine("{0:#,###.#}", 8763421.3); // 8,763,421.3

کاما معنای دیگری هم دارد. وقتی که قبل از علامت اعشار قرار می‌گیرد به عنوان یک مقیاس عمل می‌کند. هر کاما مقدار را بر 1000 تقسیم می‌کند :

Console.WriteLine("{0:#,###,.#}", 8763421.3); // 8,763.4

همانطور که در خروجی مشاهده می‌کنید مقیاس در اینجا به معنی هزار است. ولی در مثال زیر همانطور که مشاهده می‌کنید در متد WriteLine برای نمایش خروجی به صورت دقیق استفاده شده است :

Console.WriteLine("Fuel efficiency is {0:##.# mpg}", 21.3); // 21.3 mpg

می‌توان از کاراکترهای کنترلی \t یا \n در صورت لزوم استفاده کرد. کاراکتر E و e برای نمایش اعداد به صورت نماد علمی به کار می‌روند. حداقل یک صفر و در صورت لزوم تعداد بیشتری صفر بعد از E و e می‌آیند. صفرها تعداد ارقام اعشار را نشان می‌دهند. استفاده از حرف E و یا e ممکن است باعث چاپ این حروف در خروجی شوند. در نتیجه برای تعریف توان مثبت و منفی می‌توان از علامت – و + بعد از این دو کاراکتر به صورت E+ ، e+ و یا E- ، e- استفاده کرد. علامت “;” هم شما را قادر می‌سازد که اعداد مثبت، منفی و مقادیر صفر را با قالب‌های خاصی جدا سازید. شکل کلی سفارشی سازی با این کاراکتر به صورت زیر است :

Console.WriteLine("{0:#.##;(#.##);0.00}", num);

در مثال بالا اگر num مثبت باشد مقدار با دو رقم اعشار، در غیر انصورت اگر منفی باشد مقدار با دو رقم اعشار در داخل پرانتز و اگر صفر باشد به صورت 0.00 نمایش داده می‌شود. مثال زیر کاربرد کاراکترهای ذکر شده را نشان می‌دهد :

double num = 64354.2345;

Console.WriteLine("{0:#.##}", num); // 64354.23
Console.WriteLine("{0:#,###.##}", num); // 64,354.23
Console.WriteLine("{0:#.###e+00}", num); // 6.435e+04
Console.WriteLine("{0:#0,}", num); // 64
Console.Writeline("{0:#.#;(#.##);0.00}", num); // 64354.2
num = -num;
Console.WriteLine("{0:#.#;(#.##);0.00}", num); // (64354.23)
num = 0.0;
Console.WriteLine("{0:#.#;(#.##);0.00}", num); // 0.00
num = 0.95;
Console.WriteLine("{0:#%}", num); // 17%