动态String.Format取决于params

时间:2013-04-17 19:20:17

标签: c#

给出以下例子:

string amountDisplay = presentation.Amount == 1 ? "" : String.Format("{0} x ", presentation.Amount);

无论如何都使用String.Format,因此它根据属性进行格式化而不必对参数的'value'进行条件化?

另一个用例:

String.Format("({0}) {1}-{2}", countryCode, areaCode, phonenumber); 

如果我只有phonenumber,我最终会得到类似“()-5555555”的东西,这是不可取的。

另一个用例:

String.Format("my {0} has {1} cat[s]", "Aunt", 3) 

在这种情况下,我想在[]中包含s,如果值为>例如,1。

是否有任何String.Format的黑色'语法'根据参数值删除代码部分或为null?

感谢。

4 个答案:

答案 0 :(得分:2)

不是真的。你可以为复数[s]破解一些东西,当然,但它不是一个匹配所有用例的通用解决方案。

您应该检查输入的有效性。如果您希望areaCode不为null,并且它是可以为string的可空类型,请在方法的开头进行一些检查。例如:

public string Foo(string countryCode, string areaCode, string phoneNumber)
{
    if (string.IsNullOrEmpty(countryCode)) throw new ArgumentNullException("countryCode");
    if (string.IsNullOrEmpty(areaCode)) throw new ArgumentNullException("areaCode");
    if (string.IsNullOrEmpty(phoneNumber)) throw new ArgumentNullException("phoneNumber");

    return string.Format(......);
}

用户的输入补偿一些验证错误不是UI的工作。如果数据错误或丢失,请勿继续。这只会给你带来奇怪的错误和许多痛苦。

答案 1 :(得分:1)

您也可以尝试PluralizationServices服务。像这样:

using System.Data.Entity.Design.PluralizationServices;

string str = "my {0} has {1} {3}";
PluralizationService ps = PluralizationService.CreateService(CultureInfo.GetCultureInfo("en-us"));
str = String.Format(str, "Aunt", value, (value > 1) ? ps.Pluralize("cat") : "cat");

答案 2 :(得分:0)

尝试使用条件运算符:

string str = "my {0} has {1} cat" + ((value > 1) ? "s" : "");

str = String.Format(str, "Aunt", value);

答案 3 :(得分:0)

仅解决第二个问题,但是:

int x = 3;
String.Format("my {0} has {1} cat{2}", "Aunt", x, x > 1 ? "s" : "");