Как я могу определить, является ли строка составного формата недействительной? - PullRequest
5 голосов
/ 16 апреля 2010

Согласно документации , String.Format выдаст FormatException, если (A) строка формата недопустима или (B) строка формата содержит индекс, который не может быть найден в массиве args .

Я хочу иметь возможность определить, какие из этих условий (если они есть) не выполняются для любой произвольной строки и массива аргументов.

Есть ли что-нибудь, что может сделать это для меня? Спасибо!

Ответы [ 4 ]

2 голосов
/ 17 апреля 2010

Следуйте ответу Гбумила, в первом случае вы получите:

"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."

Если вам необходимо определить, какой (для обмена сообщениями пользователя или ведения журнала), вы можете использовать попытку try, подобную qor72, и проверить, с чего начинается сообщение об ошибке. Кроме того, если вам нужно захватить строку форматирования и аргументы, вам нужно будет сделать что-то вроде этого:

        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 );

        }

РЕДАКТИРОВАТЬ: Добавлено простое регулярное выражение для подсчета токенов формата. Могу помочь ...

Надеюсь, это поможет. Удачи!

1 голос
/ 16 апреля 2010

Свойство сообщения FormatException устанавливается на отдельное сообщение в каждом из этих случаев.

0 голосов
/ 24 февраля 2014

Недавно я использовал следующее регулярное выражение ниже для проверки строк составного формата во всех наших файлах ресурсов.

    /// <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

0 голосов
/ 16 апреля 2010

А ты не хочешь делать ...?

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