Come faccio a sapere il numero di sostituzioni in una stringa di formattazione?
-
27-09-2019 - |
Domanda
Dato il seguente metodo: (vero e proprio metodo ha alcuni più parametri, ma quelli più importanti sono al di sotto ...)
public string DoSomething(string formatter, params string[] values)
{
// Do something eventually involving a call to String.Format(formatter, values);
}
C'è un modo per dire se la mia matrice valori ha abbastanza oggetti in essa per coprire il formattatore, in modo che possa generare un'eccezione se non ce ne sono (a corto di fare lo string.Format, che non è un'opzione fino alla fine a causa di alcune conversioni lambda)?
Soluzione
Non sono ancora chiaro il motivo per cui si pensa che non è possibile utilizzare string.Format
per testarlo. Se il passato in formattatore si suppone di avere segnaposti per gli elementi in valori, allora si dovrebbe essere in grado di fare questo:
static void TestFormat(string formatter, params string[] values)
{
try
{
string.Format(formatter, values);
}
catch (FormatException e)
{
throw new Exception("the format is bad!!", e);
}
}
Utilizzo di esempio:
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
Cercando di fare questo con un'espressione regolare sta per essere duro, perché ciò che di qualcosa di simile:
"{0}, {1}, {abc}, {1a4} {5} }{"
{abc}
e {1a4}
non sono validi per string.Format
, e hai anche determinare per ciascun numero valido ({0}, {1}, {5}
) che avete almeno che molti argomenti. Inoltre, il }{
causerà string.Format a fallire pure.
Ho appena usato il primo approccio sopra descritto in un recente progetto e ha funzionato grande.
Altri suggerimenti
Penso che si sono preoccupanti troppo di questo. Se la stringa di formato non è valido, lasciare che string.Format
generare l'eccezione per voi. Se non si desidera un FormatException
ad essere gettato, prenderlo e generare l'eccezione che si desidera.
Inoltre, non deve essere davvero un problema che si è già fatto un po 'di alcune elaborazioni (ad es. Valutare conversioni lambda), perché questo è dopo tutto un circostanza eccezionale (con forse l'eccezione che le lambda sono molto costoso, in questo caso fare il test prima string.Format
senza elaborare gli argomenti per verificare che sia valido e quindi ripetere quando è necessario più tardi, dopo il trattamento).
Utilizzare una regex per contare il numero di modelli, ma attenzione, perché
string.Format("{0}{0}", 123)
è valido.
Hai davvero bisogno di fornire ulteriori informazioni per questa domanda a cui rispondere ok ...
Si potrebbe fare una regex per i formattatori brace e poi confrontarle con la lunghezza della schiera di valori.