سؤال

في هذا الكود الذي أقوم بتصحيحه، لدي مقتطف الكود هذا:

ddlExpYear.SelectedItem.Value.Substring(2).PadLeft(2, '0');

ماذا يعود هذا؟لا يمكنني حقًا تشغيل هذا كثيرًا لأنه جزء من تطبيق بطاقة الائتمان المباشر.تحتوي قائمة DropDownList كما يمكنك أن تتخيل من الاسم على السنة المكونة من 4 أرقام.

تحديث:شكرا لكم جميعا.لا أقوم بالكثير من تطوير .NET، لذا فإن إعداد اختبار سريع ليس بالأمر السريع بالنسبة لي.

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

المحلول

يأخذ آخر رقمين من السنة ويملأ الجانب الأيسر بالأصفار بحد أقصى حرفين.يبدو وكأنه "احتياطًا" لسنوات انتهاء الصلاحية التي تنتهي بالأرقام 08 و07 وما إلى ذلك، مع التأكد من وجود الصفر البادئ.

نصائح أخرى

يؤدي هذا إلى طباعة "98" على وحدة التحكم.

class Program
{
    static void Main(string[] args)
    {
        Console.Write("1998".Substring(2).PadLeft(2, '0'));
        Console.Read();
    }
}

بالطبع يمكنك تشغيل هذا.لا يمكنك تشغيله في التطبيق الذي تقوم بتصحيح أخطائه.لمعرفة ما يفعله، وليس فقط ما يبدو أنه يفعله، أنشئ تطبيق ويب جديدًا، ثم ضع قائمة DropDownList، ثم ضع بضع سنوات ثابتة فيه، ثم أدخل الكود الذي ذكرته وشاهد ما يفعله يفعل.ثم ستعرف على وجه اليقين.

شيء غبي.إنها تحصل على قيمة العنصر المحدد وتأخذ كل شيء بعد أول حرفين.إذا كان ذلك حرفًا واحدًا فقط، فإنه يضيف "0" إلى بدايته، وإذا كان صفرًا، فإنه يُرجع "00".السبب الذي يجعلني أقول هذا غبيًا هو أنه إذا كنت تريد أن تتكون القيمة من حرفين، فلماذا لا تقوم بتعيينها على هذا النحو لتبدأ بها عند إنشاء القائمة المنسدلة؟

يبدو أنها تلتقط السلسلة الفرعية من الحرف الثالث (إذا كان يعتمد على 0) حتى النهاية، ثم إذا كان طول السلسلة الفرعية أقل من 2، فإنها تجعل الطول يساوي 2 عن طريق إضافة 0 إلى الجانب الأيسر.

يضمن PadLeft أنك تتلقى حرفين على الأقل من الإدخال، مع ملء الإدخال (على الجانب الأيسر) بالحرف المناسب.إذن المدخلات، في هذه الحالة، قد تكون 12.يمكنك الحصول على "12" مرة أخرى.أو قد يكون الإدخال 9، وفي هذه الحالة، ستحصل على "09".

هذا مثال على التسلسل المعقد (انظر "هل هناك أي فائدة في السلسلة" post) انحرفت، وجعلت التعليمات البرمجية تبدو معقدة للغاية.

تُرجع السلسلة الفرعية القيمة مع تخطي أول حرفين، بينما يقوم الجزء الأيسر بحشو النتيجة بالأصفار البادئة:

 string s = "2014";
    MessageBox.Show(s.Substring(2).PadLeft(2, 'x')); //14
    string s2 = "14";
    MessageBox.Show(s2.Substring(2).PadLeft(2, 'x')); //xx

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

لا يقوم PadLeft بشيء إلا إذا قام المستخدم بإدخال سنة مكونة من رقمين أو ثلاثة أرقام.

مع سنة مكونة من رقم واحد، تحصل على استثناء (أخطاء Subsring).

إذا كانت السنة مكونة من رقمين (07، 08، إلخ)، فستُرجع 00.أود أن أقول أن هذا خطأ.

مع السنة المكونة من 3 أرقام (207، 208)، والتي ربما افترض المؤلف أنها أخطاء مطبعية، فإنها ستعيد الرقم الأخير المحشو بالصفر -- 207 -> 07؛208 -> 08.

طالما أنه يجب على المستخدم اختيار سنة ولا يُسمح له بإدخال سنة، فإن PadLeft غير ضروري - فالسلسلة الفرعية (2) تفعل بالضبط ما تحتاجه مع إعطاء سنة مكونة من 4 أرقام.

يبدو أن هذا الرمز يحاول الحصول على سنة مكونة من رقمين من سنة مكونة من أربعة أرقام (ddlexpyear هو التلميح)

يأخذ سلاسل ويعيد سلاسل، لذلك سأتجنب محددات السلسلة:

  • 1998 -> 98
  • 2000 -> 00
  • 2001 -> 01
  • 2012 -> 12

المشكلة هي أنها لا تقوم بعمل جيد.في هذه الحالات، الحشو لا يساعد في الواقع.لا تؤثر إزالة رمز اللوحة على الحالات التي يتم تصحيحها.

لذا فإن الكود يعمل (مع أو بدون اللوحة) لمدة 4 أرقام، فماذا يفعل بالنسبة للسلاسل ذات الأطوال الأخرى؟

  • باطل:استثناء
  • 0:استثناء
  • 1:استثناء
  • 2:تُرجع دائمًا "00".على سبيل المثالالعام 49 (عندما تم طرد اليهود من روما) يصبح "00".هذا سيء.
  • 3:يحفظ الرقم الأخير ويضع أمامه "0".صحيح في 10% من الحالات (عندما يكون الرقم الثاني في الواقع صفرًا، مثل 304 أو 908)، ولكنه خاطئ تمامًا في بقية الحالات (مثل 915 و423 و110)
  • 5:فقط يحفظ الرقمين الثالث والرابع، وهذا خطأ أيضًا، من المحتمل أن يكون "10549" هو "49" ولكنه بدلاً من ذلك "54".
  • كما يمكنك أن تتوقع استمرار المشكلة بأرقام أعلى.

حسنًا، فهي تأخذ القيمة من القائمة المنسدلة ABCD

ثم يأخذ السلسلة الفرعية من الموضع 2، القرص المضغوط

ثم أخطأ، وتركه بصفرين إذا احتاج أيضًا، قرص مضغوط

أو، إذا كنت قد انتهيت للتو من X، فستكون سلسلة فرعية إلى X ولوحة إلى OX

إنها تأخذ آخر رقمين من السنة، ثم تضع على اليسار الرقم "0".

لذا فإن عام 2010 سيكون 10، و2009 سيكون 09.

لست متأكدًا من سبب عدم قيام المطور بتعيين القيمة في القائمة المنسدلة على آخر رقمين، أو لماذا قد تحتاج إلى تركها (إلا إذا كنت تتعامل مع السنوات من 0 إلى 9 م).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top