JavaRush /وبلاگ جاوا /Random-FA /فرمت خروجی اعداد در جاوا

فرمت خروجی اعداد در جاوا

در گروه منتشر شد
سلام به همه! اغلب روش‌های ما دارای اعدادی هستند که باید در قالب خاصی نمایش داده شوند. این یک چیز کوچک به نظر می رسد، اما چگونه این کار را اجرا می کنید؟ فرمت خروجی اعداد در جاوا - 1از شما دعوت می کنیم تا امروز کمی درباره این موضوع فکر کنید. ابتدا، برای فرو رفتن در قالب‌بندی اعداد در جاوا، روش قالب‌بندی کلاس String را به خاطر می‌آوریم : قالب رشته ثابت عمومی (فرمت رشته، شیء... args) - رشته‌ای را که از رشته قالب‌بندی با استفاده از آرگومان‌های args باقی‌مانده قالب‌بندی شده را برمی‌گرداند . و فقط یک مثال:

String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
در نتیجه، خروجی را در کنسول دریافت خواهیم کرد:
سلام ساشا! وضیعت کاری چطوره؟

روش های printf و فرمت

String.format() تنها روش برای قالب بندی یک رشته نیست. آنالوگ های آن System.out.printf() و System.out.format(); . بنابراین، می توانیم کد قبلی را با:

System.out.printf("Hi - %s! How are you %s?", "Sasha", "At work");
یا

System.out.format("Hi - %s! How are you %s?", "Sasha", "At work");
خروجی کنسول ثابت خواهد ماند. تنها تفاوت این است که این متدها بر خلاف String.format() بلافاصله مقدار را در کنسول نمایش می دهند . اما من String.format() را بیشتر دوست دارم، زیرا همیشه نیازی به نمایش نتیجه در کنسول نداریم، بنابراین از این روش بیشتر استفاده خواهیم کرد. بیایید به مثال خود بازگردیم. ما چه می بینیم؟ و واقعیت این است که در مکان هایی که شخصیت ها وجود دارد - %s ، خطوط - "ساشا" و "در محل کار" درج شده است . این چگونه می تواند به ما در توسعه کمک کند؟ تصور کنید که یک متن الگوی بزرگ دارید، اما در برخی مکان‌ها باید مقادیری را وارد کنید که می‌توانند متفاوت باشند و به‌عنوان آرگومان‌هایی از بیرون آمده باشند. اینجاست که این قالب بندی به کار می آید. مشخص‌کننده‌های قالب با علامت درصد، % شروع می‌شوند و با کاراکتری پایان می‌یابند که نوع آرگومان قالب‌بندی را نشان می‌دهد. و همانطور که احتمالا متوجه شدید، %s برای درج اشیاء - رشته ها استفاده می شود. اما اگر بخواهیم مثلاً یک double را در محلی که شی رشته ثبت شده است وارد کنیم:

String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
این نیز کار خواهد کرد. double به یک رشته ریخته می شود و به دست می آوریم:
سلام - 55.6! وضیعت کاری چطوره؟
علاوه بر رشته ها و اعداد ممیز شناور، انواع دیگری نیز در جاوا وجود دارد، درست است؟ پس بیایید نگاهی به کل زرادخانه بیندازیم:
نوع مقدار برای قالب بندی مثال
%s هر نوع که به یک رشته ریخته می شود

String.format("Hi %s!","world")
نتیجه:
سلام دنیا!
%b هر نوع که به Boolean فرستاده می شود : true - اگر مقدار null نباشد، false - اگر null باشد

String.format("Hi %b!",null)
نتیجه:
سلام نادرست
%h شما می توانید هر شیئی را ارسال کنید که از متد ()hashCode به یک رشته مقدار هگزادسیمال فرستاده می شود.

String.format("Hi %h!","world")
نتیجه:
سلام 106c44!
%c برای تعیین یک کاراکتر یونیکد ( char ) استفاده می شود

String.format("Hello m%cr!",'And')
نتیجه:
سلام دنیا!
%d یک عدد صحیح مشخص شده است ( بایت بین‌المللی، کوتاه، بین‌المللی، طولانی، BigInteger )

String.format("I'm already %d!",20)
نتیجه:
من الان 20 سالمه!
% f برای تعیین یک عدد ممیز شناور استفاده می شود

String.format("PI is - %f!", 3.14159)
نتیجه:
شماره PI - 3.141590 است!
%e اعداد ممیز شناور در نماد علمی

String.format("PI is - %e!", 3.14159);
نتیجه:
شماره PI - 3.141590e+00 است!
٪آ اعداد ممیز شناور به صورت هگزادسیمال نمایش داده می شوند

String.format("PI is - %a!", 3.14159)
نتیجه:
شماره PI است - 0x1.921f9f01b866ep1!
٪ایکس یک عدد صحیح ارسال می شود ( int. byte, short, int, long, BigInteger ) نتیجه قالب بندی کاراکتری با عدد داده شده در جدول ASCII خواهد بود.

String.format("I'm already %x!",25)
نتیجه:
من در حال حاضر 19 هستم!
%o یک عدد صحیح ( int. byte, short, int, long, BigInteger ) پذیرفته شده است و به عنوان یک عدد هشتگانه نمایش داده می شود.

String.format("I already %o!",25);
نتیجه:
من الان 31 هستم!
%t پیشوند برای تبدیل تاریخ و زمان. پرچم های اضافی برای قالب بندی مورد نیاز است

String.format("Today is %tA",new Date())
نتیجه:
امروز شنبه است
%n جداکننده خط مخصوص پلت فرم. آنالوگ\n

String.format("Hello %n Hello")
نتیجه:
سلام سلام
بیایید از قالب مناسب تری برای double استفاده کنیم:

String str = String.format("The distance from Kyiv to Odessa is %f. Not so short, is it?", 475.4d);
System.out.println(str);
خروجی کنسول:
فاصله کیف تا اودسا 475.400000 است. نه چندان کم، درست است؟
همانطور که ممکن است متوجه شده باشید، %f تعیین کننده مناسب تری برای اعداد ممیز شناور است که شامل انواع داده ها مانند double و float در جاوا می شود. با این مشخص کننده می توانیم یک عدد ممیز شناور را فرمت کنیم:

String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
درج .2 در این مشخص کننده، تعداد ارقام اعشاری را به دو کاهش می دهد و خروجی را به ما می دهد:
فاصله کیف تا اودسا 475.40 است. نه چندان کم، درست است؟
.2 تنها بهینه سازی مشخص کننده ها نیست. ترکیبی از این زیرمجموعه ها یک دستورالعمل نامیده می شود . فرمت خروجی اعداد در جاوا - 2شکل کلی دستورالعمل به شرح زیر است:
%[argument_index][flags][width][.precision]مشخص کننده نوع
حالا بیایید همه چیز را به ترتیب رمزگشایی کنیم:
  • [argument_index] یک عدد صحیح است که موقعیت را در لیست آرگومان نشان می دهد. به عنوان مثال، پیوند به آرگومان اول $1، پیوند به آرگومان دوم $2 و غیره است. اگر موقعیت مشخص نشده بود، آرگومان ها باید به همان ترتیبی باشند که در رشته قالب ارجاع داده شده اند.
  • [پرچم ها] کاراکترهای خاصی برای قالب بندی هستند. مثلا:
    • پرچم + نشان می دهد که اگر یک مقدار عددی مثبت است، باید دارای علامت + باشد
    • - به معنای تراز کردن نتیجه به سمت چپ است
    • ، جداکننده هزاران را برای اعداد صحیح تنظیم می کند
  • [width] یک عدد صحیح اعشاری مثبت است که حداقل تعداد کاراکترهایی را که خروجی خواهند شد را مشخص می کند. اگر جلوی این عدد 0 وجود داشته باشد، کاراکترهای از دست رفته با 0 و اگر 0 وجود نداشته باشد، با فاصله پر می شوند.
  • [.accuracy] یک عدد صحیح غیر منفی است که قبل از آن یک نقطه وجود دارد. معمولاً برای محدود کردن تعداد کاراکترها استفاده می شود. رفتار خاص به نوع خاصی از مشخص کننده بستگی دارد.
همچنین می خواهم توجه داشته باشم که تمام عناصر بالا دستورالعمل اختیاری هستند و همه چیز بدون آنها کار خواهد کرد. به عنوان مثالی از استفاده از زیرتنظیمات، بیایید تصور کنیم که به یک خروجی خاص از عدد Pi نیاز داریم:

String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
و بر این اساس، خروجی در کنسول:
+03.14159
آسان به نظر می رسد، درست است؟ اما وقتی صحبت از قالب بندی یک عدد می شود، نمی توانید DecimalFormat را نادیده بگیرید . بیایید بفهمیم این به چه معناست.

DecimalFormat

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

DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
خروجی کنسول:
72224
خط #.### الگویی است که نشان می دهد مقدار ارسال شده را به 3 رقم اعشار قالب بندی می کنیم. چه نمادهای دیگری برای الگوها موجود است؟ در اینجا به برخی از آنها اشاره می کنیم:
  • # — رقم، صفرهای ابتدایی حذف می شوند.
  • 0 - رقم همیشه نمایش داده می شود، حتی اگر عدد ارقام کمتری داشته باشد (در این مورد، 0 نمایش داده می شود).
  • . - علامت جداکننده اعشاری؛
  • , — علامت گروه بندی جداکننده (مثلاً جداکننده هزاران).
  • ; - فرمت ها را جدا می کند.
  • - - پیشوند یک عدد منفی را نشان می دهد.
  • % - در 100 ضرب می شود و عدد را به صورت درصد نشان می دهد.
  • ? - در 1000 ضرب می شود و عدد را بر حسب ppm نشان می دهد.
  • E - آخوندک و نما را برای علامت گذاری علمی جدا می کند.
بیایید به چند مثال نگاهی بیندازیم:

System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
خروجی کنسول:
74,554,542.22

System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
خروجی کنسول:
72.35 درصد

System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
خروجی کنسول:
042.224
برای تعریف یک قالب جدید، هر بار نیازی به ایجاد یک شی DecimalFormat جدید نیست . استفاده از متدهای applicationPattern و applicationLocalizedPattern کافی است :

DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
وقتی در مورد قالب بندی یک عدد ممیز شناور صحبت می کنیم، کاملاً به گرد کردن علاقه مندیم، اینطور نیست؟ بنابراین، هنگامی که یک عدد را با اعداد اعشاری فراتر از الگوی مشخص شده برش می‌دهید، اگر آخرین عدد کوتاه‌شده بزرگ‌تر از 5 باشد، DecimalFormat عدد را به سمت بالا گرد می‌کند. اگر آخرین عدد کوتاه‌شده 5 باشد، چه؟ در واقع، در این مورد، این عدد دقیقا در وسط بین نزدیکترین اعداد صحیح است. فرمت خروجی اعداد در جاوا - 3در این صورت عدد قبلی در نظر گرفته می شود. اگر عدد قبلی زوج باشد، گرد کردن انجام می شود:

DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
خروجی کنسول:
56,459
اگر فرد باشد، اجرا نمی شود:

DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
خروجی کنسول:
56,459
تفاوت بین قالب‌بندی اعداد ممیز شناور با استفاده از String.format() و DecimalFormat.format() در این است که در حالت اول صفرهای انتهایی وجود خواهد داشت، حتی اگر هیچ بخش کسری وجود نداشته باشد. مثلا:

String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
خروجی کنسول:
9.0000

DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
خروجی کنسول:
9
همانطور که می بینید، هنگام قالب بندی عدد 9.00001273 با دقت چهار رقم اعشار، متد format() از کلاس String مقدار 9.0000 را خروجی می دهد ، در حالی که متد format() مشابه DecimalFormat خروجی 9 خواهد داشت .

BigDecimal و BigInteger

از آنجایی که به موضوع گرد کردن اعداد در جاوا پرداختیم، بیایید در مورد نحوه استفاده از کلاس BigDecimal برای چنین عملیاتی صحبت کنیم . این کلاس بر روی کار با اعداد واقعا LARGE متمرکز است: برای آن، حداکثر مقادیر دو برابر و شناور بسیار کوچک هستند. این کلاس دارای تنظیمات مختلف برای گرد کردن ممیز شناور و همچنین روش های زیادی برای عملیات حسابی است. کلاس مشابهی دارد، اما بر روی کار با اعداد صحیح بزرگ متمرکز شده است - BigInteger . در این مقاله می توانید اطلاعات بیشتری در مورد BigDecimal و BigInteger بخوانید .

قالب بندی تاریخ و زمان

فقط در بالا ذکر شد که با استفاده از format() کلاس String می توانید زمان و تاریخ را نیز فرمت کنید. فرمت خروجی اعداد در جاوا - 4خوب، بیایید نگاهی به نحوه انجام آن بیندازیم. ابتدا، می‌خواهیم به شما یادآوری کنیم که تعیین‌کننده فرمت %t برای تاریخ‌ها استفاده می‌شود . دوم، هنگام قالب‌بندی یک الگو، پرچم‌های قالب‌بندی اضافی برای هر مشخص‌کننده قالب برای تاریخ‌ها مورد نیاز است. در اینجا پرچم های قالب بندی ممکن برای تاریخ ها آمده است:
پرچم ها شرح
% tB نام کامل ماه، به عنوان مثال، ژانویه، فوریه و غیره.
%tb نام اختصاری ماه، به عنوان مثال، جان، فوریه و غیره.
%tA نام کامل روز هفته، به عنوان مثال یکشنبه، دوشنبه
%ta نام اختصاری روز هفته، به عنوان مثال، یکشنبه، دوشنبه و غیره.
%tY سال در قالب 4 رقمی، به عنوان مثال 0000 تا 9999
%ty سال در قالب 2 رقمی، به عنوان مثال، از 00 تا 99
%tm ماه با صفر در ابتدا فرمت شده است، برای مثال 01 تا 12
%tc تاریخ و زمان در قالب %ta %tb %td %tT %tZ %tY، به عنوان مثال، دوشنبه 17 فوریه 03:56:12 PST 2020
%tD تاریخ در قالب %tm/%td/%ty
%td روز ماه در قالب دو رقمی، به عنوان مثال 01 تا 31
%te روز ماه در قالب بدون پیشروی 0، به عنوان مثال از 1 تا 31
%tT زمان در قالب 24 ساعته، برای مثال %tH:%tM:%tS
%tH ساعت در روز در قالب 24 ساعته، از 00 تا 23
%tI ساعت روز برای قالب 12 ساعته، به عنوان مثال 01 تا 12
%tM دقیقه ها در ساعت با یک صفر اول فرمت می شوند، به عنوان مثال 00 تا 59
%tS ثانیه در دقیقه، متشکل از دو رقم، به عنوان مثال، از 00 تا 59
%tZ مخفف منطقه زمانی، مانند PST، UTC، و غیره.
این لیست کوتاه شده ای از پرچم های قالب بندی تاریخ ممکن است - تعداد زیادی از آنها برای هر سلیقه ای وجود دارد. لیست کامل آنها و مشخص کننده های احتمالی را می توانید در این لینک پیدا کنید . بیایید نحوه استفاده از این را بررسی کنیم. این بار ما از String.format() استفاده نمی کنیم ، بلکه بلافاصله از System.out.printf() استفاده می کنیم .

مثال 1

علاوه بر این، زبان نتیجه را با ارسال آن به عنوان اولین آرگومان به متد تنظیم می کنیم:

Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
خروجی کنسول:
11 اکتبر 2020
بدون تعیین زبان، از زبان پیش فرض استفاده می شود (مثلاً من روسی دارم).

مثال 2

بیایید تاریخ کامل تری را نمایش دهیم:

Date date = new Date();
System.out.printf("%td %tB %tY of %n%tH:%tM:%tS",date,date,date,date,date,date,date);
و خروجی در کنسول:
11 اکتبر 2020 13:43:22
ارسال چندین بار همان شی Date به عنوان آرگومان... خیلی خوب به نظر نمی رسد، درست است؟ بیایید از زیرمجموعه داخلی $ برای تعیین آرگومانی که می خواهیم استفاده کنیم استفاده کنیم:

System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
خروجی کنسول ما تغییر نخواهد کرد. راه های به همان اندازه جالب دیگری برای قالب بندی تاریخ ها وجود دارد. شما می توانید در مورد آنها و کمی بیشتر در مورد زمان و تاریخ در جاوا در این مطالب بخوانید . این همه برای امروز است، از توجه شما متشکرم!فرمت خروجی اعداد در جاوا - 5
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION