Как я могу определить, является ли строка композитной форматирования недействительной?

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

  •  27-09-2019
  •  | 
  •  

Вопрос

На документацию, String.Format бросит А. FormatException Если либо (a) строка формата недействительна или (b) строка формата содержит индекс, который не может быть найден в Args Array.

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

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

Это было полезно?

Решение

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

"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 для подсчета токенов формата. Может помочь...

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

Другие советы

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

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

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