Como posso dizer o número de substituições em uma string formatadora?
-
27-09-2019 - |
Pergunta
Dado o seguinte método: ((o método real tem mais alguns parâmetros, mas os importantes estão abaixo ...)
public string DoSomething(string formatter, params string[] values)
{
// Do something eventually involving a call to String.Format(formatter, values);
}
Existe uma maneira de saber se minha matriz de valores tem objetos suficientes para cobrir o formatador, para que eu possa dar uma exceção se não houver (sem fazer a string.format; isso não é uma opção até o fim devido a algumas conversões de lambda)?
Solução
Ainda não estou claro por que você acha que não pode usar string.Format
para testá -lo. Se o passado no formatador deve ter espaços reservados para os itens em valores, você poderá fazer isso:
static void TestFormat(string formatter, params string[] values)
{
try
{
string.Format(formatter, values);
}
catch (FormatException e)
{
throw new Exception("the format is bad!!", e);
}
}
Uso de amostra:
TestFormat("{0}{1}{2}", "a", "b", "c"); // works ok
TestFormat("{0}{1}{2}", "a", "b"); // throws exception
TestFormat("{0}{1}{2}}0{", "a", "b", "c"); // throws exception
Tentar fazer isso com uma expressão regular será difícil, porque e algo assim:
"{0}, {1}, {abc}, {1a4} {5} }{"
{abc}
e {1a4}
não são válidos para string.Format
, e você também precisa determinar para cada número válido ({0}, {1}, {5}
) que você tem pelo menos tantos argumentos. Também o }{
fará com que String.Format também falhe.
Acabei de usar a abordagem anterior descrita acima em um projeto recente e funcionou muito bem.
Outras dicas
Eu acho que você está se preocupando muito com isso. Se a sequência do formato for inválida, deixe string.Format
Jogue a exceção para você. Se você não quer um FormatException
Para ser jogado, pegue -o e jogue a exceção que você deseja.
Também não deve ser realmente um problema que você já tenha feito algum processamento (por exemplo, avaliação de conversões lambda) porque isso é afinal um circunstância excepcional (com possivelmente a exceção de que os lambdas são muito caros, nesse caso string.Format
Teste primeiro sem processar os argumentos para verificar se é válido e, em seguida, repita -o quando precisar posteriormente após o processamento).
Use um regex para contar o número de modelos, mas tenha cuidado, porque
string.Format("{0}{0}", 123)
é válido.
Você realmente precisa fornecer mais informações para que esta pergunta seja respondida ok ...
Você pode fazer um regex para os formatados de cinta e compará -los com o comprimento da matriz de valor.