كيف يمكنني استخدام Sprintf إلى Zero ill إلى طول متغير في Perl؟

StackOverflow https://stackoverflow.com/questions/2471298

  •  20-09-2019
  •  | 
  •  

سؤال

أريد استخدام بيرل Sprintf إلى Zerofill متغير.

sprintf("%08d", $var);

لكني أريد تحديد عدد الأرقام إلى Zerofill.

كيف يمكنني استبدال "8" في sprintf("%08d", $var) مع متغير يسمى $zerofill?

هل كانت مفيدة؟

المحلول

الحجة الأولى ل Sprintf هي مجرد سلسلة:

 my $zerofill = 9;
 my $number = 1000;
 my $filled = sprintf "%0${zerofill}d", $number;

لاحظ الأقواس لتمييز الاسم المتغير من بقية السلسلة.

لدينا هذه المشكلة بالذات كتمرين ذكي قليلاً في تعلم بيرل لتذكير الناس بأن السلاسل مجرد سلاسل. قون

ولكن كما يشير Mobrule في إجابته, ، لدى Sprintf العديد من الميزات لمنحك هذا النوع من المرونة. إن الوثائق لمثل هذه الوظيفة البسيطة على ما يبدو طويلة جدًا وهناك الكثير من الأشياء الجيدة فيها.

نصائح أخرى

sprintf و printf دعم * تدوين (لقد نجح هذا منذ 5.8):


printf "%0*d", 9, 12345;

000012345

printf '$%*.*f', 8, 2, 456.78;

$  456.78

كنت بحاجة إلى القيام بشيء مختلف قليلاً: صفر لوحة نقطة عائمة والحصول على طول دقيق.

في حالتي ، أحتاج بالضبط إلى 12 بايت بما في ذلك النقطة العشرية. إنه أصعب قليلاً مما لديك أعلاه. هنا في حال احتاج أي شخص إلى هذا:

قل $ inputval هي سلسلة تم تمريرها من مكان ما مع قيمة مثل 1001.1. لاحظ أنه يجب أن يكون أقل من 12 حرفًا حتى يعمل هذا بشكل موثوق

 # This will give us extra zeros, but the string may be too long
 my $floatVal = sprintf('%*.*f', 12, 12, $inputValue);

 # This will remove any extra zeros
 $result = substr($floatVal, 0, 12);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top