Простой способ проверить действительность FormatString?

Есть ли простой способ проверить, действительна ли строка формата? Например, следующий код - это код, который мы используем для проверки строки числового формата;

public static bool IsValidFormatStringNumber(string FormatString)
{
    try
    {
        const decimal number = 0.056m;
        var formattedNumber = number.ToString(FormatString);
        return formattedNumber.Length > 0;
    }
    catch
    {
        return false;
    }
}

Мы пытаемся перехватить исключение или определить, не имеет ли полученная строка длины. Однако этот тест не проходит, поскольку строка формата «hsibbur» (любой мусор) приводит к строке «hsaibbur», имеющей длину.

Мы хотим провести такой же тест для строки формата процента и даты.


person paligap    schedule 02.11.2011    source источник
comment
Проверка toString на базовом типе в основном похожа на x=1;if(x!=1)throw error;? Я не вижу такой детализации, что вам нужно было бы протестировать строковый формат (если я чего-то не упускаю, или вам нужно лучшее округление, или ...) - РЕДАКТИРОВАТЬ: вы пытаетесь перебрать возможные IFormatProviders ?   -  person Brad Christie    schedule 02.11.2011
comment
Но строка формата hsibbur действительна!   -  person John Saunders    schedule 02.11.2011
comment
Кроме того, как насчет ловли только FormatException? Вы скрываете все возможные реальные исключения.   -  person John Saunders    schedule 02.11.2011
comment
Есть категория кода, который никогда не требует дополнительной проверки или разработки схем контрактов. В верхней части кучи находится код, который превращает состояние программы в нечто доступное для чтения человеком. Первое, что вы увидите, первое, что вы исправите, когда он сломается.   -  person Hans Passant    schedule 02.11.2011
comment
Пока хорошие отзывы. Нам нужно проверить, действительна ли строка формата, потому что мы позволяем пользователю указывать строки формата для процентов, чисел и даты. Это расширенные настройки, и если они не действительны, это приведет к возникновению исключений в другом месте программы. Чтобы противостоять этому, мы хотели бы запустить проверку, чтобы убедиться, что он действителен, прежде чем мы сохраним его в базе данных.   -  person paligap    schedule 02.11.2011


Ответы (2)


Если вы просто хотите проверить строки стандартного формата, просто убедитесь, что ваши строки формата являются частью этого списка.

Если вы хотите проверить строки настраиваемого формата (которые не являются "Other" или "Literal strings"), вы, вероятно, можете создать регулярное выражение для этого.

В остальном, поскольку строки формата могут быть произвольными строками, я не думаю, что проверка даже применима.

person Jordão    schedule 02.11.2011
comment
Спасибо, Жордао. Ваш последний пункт является хорошим и является одной из основных причин, по которой мы хотим разрешить пользователю вводить действительный. Хотя можно ввести любую строку формата, это приведет к выбрасыванию исключений ниже по потоку. Лучше просто обеспечить правильную / допустимую строку формата. - person paligap; 02.11.2011

Если FormatString равен formattedNumber, это может быть еще один случай возврата false.

person Jim Rhodes    schedule 02.11.2011