Я пытаюсь изолировать (в целях локализации) форматирование некоторых сообщений. В одном из случаев у меня есть несколько параметров, некоторые из которых могут быть пустой строкой. Пример, вероятно, требуется здесь....
Если параметрами является Параметр один и Параметр два затем, я хочу, чтобы результатом было Некоторое сообщение Параметр один (Параметр два).
Если параметрами является Параметр один и строка. Пустой затем я хочу, чтобы результатом было Некоторое сообщение Параметр один
Если бы Параметр два был числовым значением, то я мог использовать что-то как:
String.Format("Test {0}{1:' ('#')'}", "Parameter one", 12);
Это работает, как я ожидал бы - конкретно, если второй параметр является пустым, вывод является просто Тестовым Параметром один.
К сожалению, я еще не нашел подобную опцию, которая работает со строковыми параметрами. Есть ли один?
Разъяснение: Я полностью осведомлен о многочисленных способах получить результат, в котором я нуждаюсь в коде. Я конкретно хочу знать, существует ли подобный встроенный механизм для строк к числовой, показанной выше.
Вы всегда можете попытаться написать свой собственный модуль форматирования строк, реализовав IFormatProvider и ICustomFormatter
Затем вызовите его как
var stringValue = string.Format(new NewCustomStringFormatInfo(),
"Test {0}{1:' ('#')'}", "Parameter one", 12)
Вы можете написать свою собственную оболочку String.Format (непроверено):
string MyFormat(string format, params object[] args)
{
object[] newArgs = new object[args.Length];
for(int i=0; i<args.Length; i++)
{
if(args[i] is string)
{
newArgs[i] = String.IsNullOrEmpty(args[i] as string) ? "" : string.Format("({0})", args[i]);
}
//numeric cases etc
else
{
newArgs[i]=args[i];
}
}
return string.Format(format, newArgs);
}
Вы можете создать метод расширения, который поможет справиться с этим и сделать его немного более кратко.
public static string SomeWellNamedExtension(this string s)
{
if(string.IsNullOrEmpty(s))
return "";
return string.Format("({0})", s);
}
Этот метод будет обрабатывать нулевую / пустую проверку и скобки. Это довольно специализированный метод, поэтому он вряд ли пригодится где-либо еще. Но тогда ваш код будет примерно таким:
string.Format("Test {0}{1}, paramOne, paramTwo.SomeWellNamedExtension());
Однако ymmv. Это повлияет на вашу строку формата, поскольку за скобки больше не будет его ответственности. Я не могу придумать много супер элегантных способов обработки варианта использования, о котором вы говорите подробно.
var s = System.String.IsNullOrEmpty(param2) ? string.Format(...) : string.Format(...)
Если вы не определите функцию, которая заключает значение в скобки, я не вижу, как вы делаете это inline?
Простой пример:
string.Format("Some message {0} {1}", "Parameter one", EncloseInParenthsisIfNotEmpty(""))
public string EncloseInParenthsisIfNotEmpty(string input)
{
if (string.IsNullOrEmpty(input)) return "";
return string.Format("({0})", input);
}
Зависит от вашей ситуации, но вы могли бы сделать
string.Format(yourFormatString, paramOne, paramTwo).Replace("()", "");
Никаких гарантий, так как это не защищает от дурака и делает большое предположение, что ваша результирующая строка будет содержать "()" только если paramTwo пуст.