كيف يمكنني تحديد ما إذا كانت سلسلة تنسيق مركب غير صالحة؟

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

  •  27-09-2019
  •  | 
  •  

سؤال

لكل الوثائق, String.Format سوف رمي أ FormatException إذا كانت (أ) سلسلة التنسيق غير صالحة أو (ب) تحتوي سلسلة التنسيق على فهرس لا يمكن العثور عليه في صفيف ARGS.

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

هل هناك أي شيء يمكن أن يفعل ذلك من أجلي؟ شكرًا!

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

المحلول

تابع إجابة Gbogumil ، في الحالة الأولى التي تحصل عليها:

"Input string was not in a correct format."

وفي الثانية ، تحصل على:

"Index (zero based) must be greater than or equal to 
zero and less than the size of the argument list."

إذا كنت بحاجة إلى الإحساس بأي (بالنسبة لرسائل المستخدم أو التسجيل) ، فيمكنك استخدام تجربة مثل QOR72 المقترحة ، والتحقق من ما تبدأ به رسالة الخطأ. بالإضافة إلى ذلك ، إذا كنت بحاجة إلى التقاط ما كانت عليه سلسلة التنسيق ، وما هي ARGS ، فستحتاج إلى فعل شيء مثل هذا:

        string myStr = "{0}{1}{2}";
        string[] strArgs = new string[]{"this", "that"};
        string result = null;

        try { result = string.Format(myStr, strArgs); }

        catch (FormatException fex)
        {
            if (fex.Message.StartsWith("Input"))
                Console.WriteLine
                  ("Trouble with format string: \"" + myStr + "\"");
            else
                Console.WriteLine
                  ("Trouble with format args: " + string.Join(";", strArgs));
            string regex = @"\{\d+\}";
            Regex reg = new Regex(regex, RegexOptions.Multiline);
            MatchCollection matches = reg.Matches(myStr);
            Console.WriteLine
                ("Your format has {0} tokens and {1} arguments", 
                 matches.Count, strArgs.Length );

        }

تعديل: أضاف regex البسيطة لحساب الرموز التنسيق. قد تساعد...

أتمنى أن يساعدك هذا. حظا طيبا وفقك الله!

نصائح أخرى

يتم تعيين خاصية رسالة FortAtexception على رسالة متميزة في كل حالة من هذه الحالات.

وأنت لا تريد أن تفعل ...؟

works = true;
try {
  String.Parse(Format, ObjectArray);
} catch FormatException {
works = false; }

لقد استخدمت مؤخرًا التعبير العادي التالي أدناه للتحقق من صحة سلاسل التنسيق المركب في جميع ملفات الموارد الخاصة بنا

    /// <summary>
    /// The regular expression to get argument indexes from a composed format string
    /// </summary>
    /// <remarks> 
    /// example         index   alignment   formatString
    /// {0}             0       
    /// {1:d}           1                   d
    /// {2,12}          2       12
    /// {3,12:#}        3       12          #
    /// {{5}}           
    /// {{{6}}}         6
    /// </remarks>
    private static readonly Regex ComposedFormatArgsRegex =
        new Regex(@"(?<!(?<!\{)\{)\{(?<index>\d+)(,(?<alignment>\d+))?(:(?<formatString>[^\}]+))?\}(?!\}(?!\}))",
            RegexOptions.Compiled | RegexOptions.ExplicitCapture);

لمزيد من المعلومات حول السلاسل المنسقة المركبة ، انظر http://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx

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