قالب بندی مقادير عددی به عنوان رشته ها

در این درس به صورت جامع و تخصصی، فرآیند قالببندی numeric values به رشته در زبان جاوا با استفاده از ابزارهایی نظیر String.format()، System.out.printf() و کلاس DecimalFormat بررسی میشود. مباحث شامل نحوهی تنظیم الگوهای قالببندی مانند #,###.##
، کنترل تعداد ارقام اعشار، اضافه کردن جداکنندههای هزارگان و تنظیم Locale برای پشتیبانی از محیطهای چندزبانه است. این آموزش با ارائه مثالهای عملی و کدهای دقیق، دیدگاهی کامل از تکنیکهای بهروز جهت تبدیل اعداد به فرمتهای متنی مورد نیاز در برنامههای حرفهای و صنعتی ارائه میدهد؛ به طوری که هم نیازهای مبتدیان و هم الزامات متخصصان بازار کار را برآورده سازد.
من در ویدئوهای آموزشی قبلی توضیح دادم که چطوری با یک رشته که شامل کاراکترهای عددی هست، شروع کنیم و با استفاده از کلاس های کمکی نوع داده های اولیه و متدهای parse شان اون رشته رو به یک مقدار اولیه تبدیل کنیم. برای مثال، یک رشته یک، دو، سه، چهار، میتواند با استفاده از متد parse double کلاس دابل به یک مقدار دابل تبدیل بشود. ولی همچنین شما میتوانید یک مقدار از نوع داده های اولیه رو با استفاده از کلاس های مختلفی که در رانتایم جاوا قرار دارد به فرمت string در بیاورید.
در این پروژه یعنی FormatNumbers، من از قبل یک مقدار اولیه با نام doubleValue ایجاد و اعلام کردم.
همانطور که مشخص است این متغیر یک مقدار میلیونی دارد. علامت های underscore، فقط برای خوانایی بهتر استفاده میشوند و توسط کامپایلر نادیده گرفته میشوند و کامپایلر اونها رو در نظر نمیگیرد.
خب؛ حالا من میخواهم این مقدار رو بگیرم و آنرا به شکل و فرمت یک string در بیاورم.
همانطور که قبلاً هم اینکار رو کردیم، میآیم از کلاس NumberFormat استفاده میکنم. پس ابتدا نام این کلاس رو تایپ میکنم و از لیست باز شده آنرا انتخاب میکنم و میبینیم که یک عبارت ایمپورت هم برای ما به بالای کدمان اضافه میشود.
اسمش رو میگذارم numf که مخفف NumberFormat باشد و با صدا زدن یک متد استاتیک از کلاس NumberFormat با نام getNumberInstance مرجع آنرا به دست میآورم.
به این شکل.
بعد میآیم این عبارت رو در خروجی کنسول چاپ میکنم که با کلمه ” Number دو نقطه” شروع میشود و مقدار فرمت شده متغیر doubleValue رو هم با استفاده از عبارت numf.format و دادن متغیر doubleValue داخل پرانتز به آن اضافه میکنم.
و وقتی که کدم رو اجرا میکنم، میبینیم که یک رشته به من برمیگرداند که با علامت کاما از هم جداسازی شدند.
در حال حاضر متناسب با موقعیت مکانیای که برای سیستم عامل من و نرم افزار intelij idea بطور دیفالت تعریف شده یا اینکه بطور دستی تنظیم کردهام؛ از علامت کاما به عنوان جداکننده و از علامت نقطه برای نمایش اعداد اعشاری استفاده میشود. در حقیقت اینها تنظیمات دیفالت لوکال من محسوب میشوند و می بینید نرم افزار هم دارد از آنها بهره میبرد. ولی در موقعیت های مکانی دیگر، و بعبارتی در لوکال ها و سیستم های محلی دیگر مثل سیستم خود شمایی که ممکن است از هر کشوری این ویدئو رو مشاهده کنید؛ ممکن است برعکس این قضیه رو ببینید، یعنی ببینید که از نقطه برای جداسازی و از کاما برای نمایش اعداد اعشاری استفاده میشود.
البته خودتان میتوانید مستقیماً تنظیمات لوکال سیستم تان را برای تغییر دادن آن به هر چیز دلخواه دیگری، خیلی راحت تنظیم کنید.
پس برای نمایش یک این چنین سناریویی به شما، کرسرم رو در بالا کدم قرار میدهم و یک نمونه از یک کلاس Locale رو ایجاد میکنم.
بد نیست بدانید این کلاس عضوی از پکیج java.util هست.
پس وقتی آنرا انتخاب میکنم، یک عبارت ایمپورت به صورت اتوماتیک در قسمت ایمپورت ها برای من اضافه میشود.
نام متغیرم رو میگذارم locale، با حروف تماماً کوچک.
و با کلاس سازنده Locale آنرا نمونه سازی و معرفی میکنم.
همانطور که میبینید کلاس سازنده Locale چند تا نسخه مختلف دارد. یعنی آرگومان هایی که میگیرد متفاوت هستند.
من میخواهم از لیست ظاهر شده، از اون نسخهای استفاده کنم که دو تا رشته میخواهد که این دو تا رشته مد نظرم هم مربوط به زبان و کشور میشوند. عبارتی که برای رشته مربوط به زبان وارد میکنم، باید با حروف تماماً کوچک باشد و من اینجا عبارت da رو که مربوط به زبان دانمارکی میشود، وارد میکنم.
بعد برای رشته مربوط به کشور عبارت DK با حروف تماماً بزرگ رو که برای کشور دانمارک هست برای آن تنظیم میکنم.
بعد میآیم سراغ این متد getNumberInstance و اون شیء locale رو به آن میدهم. همانطور که میبینید وقتی کرسرم رو میگذارم داخل پرانتز مربوط به این متد دو نسخه از این متد میبینیم.
یکی از آنها که در حال حاضر هم آنرا استفاده کرده ام باno parameters نشان داده شده، هیچ پارامتری نمیگیرد، و اون یکی یک locale به عنوان پارامتر میگیرد.
خب؛ من متغیر locale ای رو که الان ایجاد کرده ام رو وارد میکنم، و برای آن تعریفش می کنم، و یکبار دیگر از کدم اجرا میگیرم، و اینبار، میبینیم که شبیه استاندارد یکا تعریف شده برای کشور دانمارک، از علامت نقطه برای جداسازی استفاده شده.
و این کد باید بدون درنظر گرفتن لوکال تون یا موقعیت مکانی کامپیوترتان، در همه موارد جواب بدهد و درست شبیه این چیزی که دارید می بینید، کار کند. خب این یک عدد ساده بود.
ولی اگر خواستید با مقادیر ارزی کار کنید چی؟ در اون صورت باید چکار کرد؟
من یک نمونه دیگر از کلاس NumberFormat ایجاد میکنم، و اینبار برای این یکی اسمش رو curf میگذارم و با صدا زدن متد getCurrencyInstance از کلاس NumberFormat مرجع آنرا بدست میآورم.
توجه داشته باشید که باز هم برای این متد دو نسخه وجود دارد، یکی نسخه ای که هیچ پارامتری نمیگیرد و یکی هم نسخهای که یک locale میگیرد.چون قصد من پیشروی با تظیمات لوکال سیستمم هست گزینه ای که هیچ پارامتری نمیگیرد رو انتخاب می کنم.
بعد میآیم این عبارت رو درخروجی نمایش میدهم، با یک برچسبCurrency دو نقطه، شروع میکنم و بعد مقداری که به فرمت currency درآمده رو به آن اضافه میکنم. با عبارت curf.format و دادن متغیر doubleValue به عنوان پارامتر آن. به این شکل.
و وقتی که از کدم اجرا میگیرم، میبینیم که یک مقدار ارزی رو که با علامت dollar شروع شده به ما برمیگرداند.
باز هم میگویم که نحوه نمایش این رشته ها بسته به لوکال تعریفی یا همان محل پیشفرض کامپیوترتان ممکن است متفاوت باشد.
خب؛ ولی اگر من بروم به متد getCurrencyInstance و متغیر localeام رو یعنی استاندارد تعریف شده برای کشور دانمارک رو، به آن بدهم و از کدم اجرا بگیرم، اینبار بجای علامت dollar، عبارت KR نمایش داده میشود که مربوط به واحد پول کرون، که همان واحد پول دانمارک است، میشود.
در آخر، میخواهم به شما نشان بدهم که اگر از متد getIntegerInstance استفاده کنیم چی میشود و چه اتفاقی میافتد.
من یک شیء دیگر از کلاس Numberformat ایجاد میکنم، نام این شیء رو intf میگذارم و عبارت Numberformat.getIntegerInstance رو فراخوانی میکنم.
بعد یک کپی از این خط مربوط به Currency، که مربوط به خروجی میشود رو درست از اینجا میگیرم و این پایین برای کد جدید آنرا پاست میکنم؛ و برچسب آنرا به Integer تغییر میدهم و برای عبارت فرمت شده از متغیر intF استفاده میکنم، و این هم نتیجه.
همانطور که میبینید این رشته عددی که به فرمت integer هست، گرد شده عددی است که قبلاً داشتیم.
علاوه بر اینها، شیء decimal format ای هم وجود دارد که میتوانید برای سفارشی سازی نمایش مقادیر عددی از آن استفاده کنید. که کار با آن رو بعنوان تمرین میگذارم بر عهده خودتان.
خب؛ در این قسمت یک مقدمه جامع و کاملی از فرمتهای عددی در جاوا برای شما گفتم. به طور خلاصه میتوانید با استفاده از کلاسnumber format و یا decimal format یک مقدار از نوع داده های اولیه رو بگیرید و به عنوان یک نوع فرمت برای string یا رشته هایتان، در خروجی آنرا نمایش بدهید.