JavaRush /مدونة جافا /Random-AR /تنسيق إخراج الأرقام في جافا

تنسيق إخراج الأرقام في جافا

نشرت في المجموعة
أهلاً بكم! غالبًا ما تأتي طرقنا مع أرقام يجب عرضها بتنسيق خاص. يبدو الأمر وكأنه شيء صغير، ولكن كيف يمكنك تنفيذ هذه المهمة؟ تنسيق إخراج الأرقام في جافا - 1نحن ندعوك للتفكير في هذا الأمر قليلاً اليوم. أولاً، للتعمق في تنسيق الأرقام في Java، دعونا نتذكر طريقة التنسيق لفئة السلسلة : تنسيق السلسلة الثابتة العامة (تنسيق السلسلة، كائن... args) - يُرجع سلسلة منسقة من سلسلة التنسيق باستخدام وسيطات الوسائط المتبقية . ومثال فقط:
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
ونتيجة لذلك، سوف نحصل على الإخراج في وحدة التحكم:
مرحبا ساشا! كيف هي الأمور في العمل؟

طرق الطباعة والتنسيق

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 لإدراج كائنات - سلاسل. ولكن إذا حاولنا، على سبيل المثال، إدراج مزدوج في المكان الذي تم تسجيل كائن السلسلة فيه:
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
وهذا سوف يعمل أيضا. سيتم إلقاء المضاعفة على سلسلة وسنحصل على:
مرحبا - 55.6! كيف هي الأمور في العمل؟
إلى جانب السلاسل النصية وأرقام الفاصلة العائمة، هناك أنواع أخرى في Java، أليس كذلك؟ لذلك دعونا نلقي نظرة على الترسانة بأكملها:
نوع القيمة المراد تنسيقها مثال
٪س أي نوع سيتم إرساله إلى سلسلة
String.format("Hi %s!","world")
نتيجة:
مرحبا بالعالم!
٪ب أي نوع سيتم تحويله إلى قيمة منطقية : صحيح - إذا لم تكن القيمة فارغة، وخطأ - إذا كانت فارغة
String.format("Hi %b!",null)
نتيجة:
مرحبا كاذبة
يمكنك تمرير أي كائن، والذي سيتم تحويله إلى سلسلة قيمة سداسية عشرية من طريقة hashCode()
String.format("Hi %h!","world")
نتيجة:
مرحبا 106c44!
يستخدم لتحديد حرف Unicode ( char )
String.format("Hello m%cr!",'And')
نتيجة:
مرحبا بالعالم!
٪د تم تحديد عدد صحيح ( int. byte, short, int, long, BigInteger )
String.format("I'm already %d!",20)
نتيجة:
عمري 20 عامًا بالفعل!
٪F يستخدم لتحديد رقم النقطة العائمة
String.format("PI is - %f!", 3.14159)
نتيجة:
رقم PI هو - 3.141590!
أرقام النقطة العائمة في التدوين العلمي
String.format("PI is - %e!", 3.14159);
نتيجة:
رقم PI هو - 3.141590e+00!
٪أ سيتم تمثيل أرقام الفاصلة العائمة بالنظام الست عشري
String.format("PI is - %a!", 3.14159)
نتيجة:
رقم PI هو - 0x1.921f9f01b866ep1!
%x يتم تمرير عدد صحيح ( int. byte, short, int, long, BigInteger )، وستكون نتيجة التنسيق هي الحرف ذو الرقم المحدد في جدول ASCII
String.format("I'm already %x!",25)
نتيجة:
عمري 19 عامًا بالفعل!
يتم قبول عدد صحيح ( int. byte, short, int, long, BigInteger ) وسيتم تمثيله كرقم ثماني
String.format("I already %o!",25);
نتيجة:
عمري 31 عامًا بالفعل!
%t بادئة لتحويلات التاريخ والوقت. علامات إضافية مطلوبة للتنسيق
String.format("Today is %tA",new Date())
نتيجة:
اليوم هو السبت
٪ن فاصل الخط الخاص بالمنصة. تناظري\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 في Java. باستخدام هذا المحدد يمكننا تنسيق رقم النقطة العائمة:
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 هي فئة لتنسيق أي رقم في Java، سواء كان عددًا صحيحًا أو رقمًا عائمًا. عند إنشاء كائن DecimalFormat ، يمكنك تحديد قالب لتنسيق الأرقام الواردة مباشرةً في المُنشئ. هذا ما سيبدو عليه مثالنا باستخدام DecimalFormat :
DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
إخراج وحدة التحكم:
72,224
السطر #.### هو نمط يشير إلى أننا نقوم بتنسيق القيمة التي تم تمريرها إلى 3 منازل عشرية. ما هي الرموز الأخرى المتاحة للأنماط؟ وهنا بعض منها:
  • # - رقم، تم حذف الأصفار البادئة؛
  • 0 — يتم عرض الرقم دائمًا، حتى لو كان الرقم يحتوي على أرقام أقل (في هذه الحالة، يتم عرض 0)؛
  • . — علامة الفاصل العشري؛
  • ، - علامة تجميع الفواصل (على سبيل المثال، فاصل الآلاف)؛
  • ; — يفصل بين التنسيقات؛
  • - — يمثل بادئة الرقم السالب؛
  • % - الضرب في 100 ويظهر الرقم كنسبة مئوية؛
  • ؟ - الضرب بـ 1000 ويظهر الرقم بجزء في المليون؛
  • 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#");
عندما نتحدث عن تنسيق رقم الفاصلة العائمة، فإننا مهتمون جدًا بالتقريب، أليس كذلك؟ لذلك، عند قطع رقم بمنازل عشرية خارج النمط المحدد، يقوم DecimalFormat بتقريب الرقم لأعلى إذا كان آخر رقم تم اقتطاعه أكبر من 5. ماذا لو كان الرقم الأخير الذي تم اقتطاعه هو 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 لمثل هذه العمليات . تركز هذه الفئة على العمل مع الأعداد الكبيرة حقًا: بالنسبة لها، الحد الأقصى للقيم المزدوجة والعائمة صغير جدًا. تحتوي هذه الفئة على العديد من الإعدادات المختلفة لتقريب الفاصلة العائمة، بالإضافة إلى العديد من الطرق للعمليات الحسابية. لديها فئة مماثلة، ولكنها تركز على العمل مع الأعداد الصحيحة الكبيرة - BigInteger . يمكنك قراءة المزيد عن BigDecimal و BigInteger في هذه المقالة .

تنسيق التاريخ والوقت

لقد ذكرنا أعلاه فقط أنه باستخدام format() ‎ لفئة String، يمكنك أيضًا تنسيق الوقت والتاريخ. تنسيق إخراج الأرقام في Java - 4حسنًا، دعونا نلقي نظرة على كيفية القيام بذلك. أولاً، نود أن نذكرك بأن محدد التنسيق %t يُستخدم للتواريخ . ثانيًا، عند تنسيق قالب، تكون علامات التنسيق الإضافية مطلوبة لكل محدد تنسيق للتواريخ. فيما يلي علامات التنسيق المحتملة للتواريخ:
أعلام وصف
% تي بي اسم الشهر بالكامل، على سبيل المثال، يناير، فبراير، إلخ.
% تيرابايت اسم الشهر المختصر، على سبيل المثال، يناير، فبراير، إلخ.
%tأ الاسم الكامل ليوم الأسبوع، على سبيل المثال، الأحد، الاثنين
%تا الاسم المختصر ليوم من أيام الأسبوع، على سبيل المثال، Sun، Mon، إلخ.
%tyY السنة بتنسيق مكون من 4 أرقام، على سبيل المثال من 0000 إلى 9999
%ty السنة بتنسيق مكون من رقمين، على سبيل المثال، من 00 إلى 99
%tm يتم تنسيق الشهر بالصفر في البداية، على سبيل المثال من 01 إلى 12
التاريخ والوقت بالتنسيق %ta %tb %td %tT %tZ %tY، على سبيل المثال، الإثنين 17 فبراير 03:56:12 بتوقيت المحيط الهادئ 2020
%tD التاريخ بتنسيق %tm/%td/%ty
%td يوم الشهر بتنسيق مكون من رقمين، على سبيل المثال من 01 إلى 31
%te يوم من الشهر بتنسيق بدون بداية 0، على سبيل المثال من 1 إلى 31
%tT الوقت بتنسيق 24 ساعة، على سبيل المثال %tH:%tM:%tS
٪ذ ساعة اليوم بتنسيق 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
تمرير نفس كائن التاريخ كوسيطة عدة مرات... لا يبدو الأمر جيدًا، أليس كذلك؟ لنستخدم المجموعة الفرعية $ الداخلية لتحديد الوسيطة التي نريد استخدامها:
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
لن يتغير الإخراج في وحدة التحكم الخاصة بنا. هناك طرق أخرى مثيرة للاهتمام بنفس القدر لتنسيق التواريخ. يمكنك أن تقرأ عنها والمزيد عن الوقت والتاريخ في Java في هذه المادة . هذا كل شيء لهذا اليوم، شكرا لاهتمامكم!تنسيق إخراج الأرقام في Java - 5
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION