在For循环中格式化字符串构建器

时间:2014-04-15 17:12:58

标签: c# asp.net css

我的webform功能使用for循环输出购物车中的每个商品。但是,我的问题是格式化此字符串,使其包含制表符空格,以及购物车中每个项目的新行。我的代码就是这样:

public string Display()
{
    CartClass CartList = CartClass.GetCart();
    System.Text.StringBuilder sb = new StringBuilder();
    for (int i = 0; i < CartList.CartList.Count(); i++)
    {
        Movies Movie = CartList.CartList[i];
        sb.Append(String.Format(i + 1 + "." + "\t" 
+ Movie.MovieName + "\t" + "£" + Movie.MovieCost.ToString() + "\n" ));
    }
    return sb.ToString();
} 

另请注意,我使用此函数在asp:listbox中输出此字符串

private void DisplayCart()
{
    lstCart.Items.Clear();
    lstCart.Items.Add(cart.Display());
}

我的出来就是这个 FormattingString

我希望格式类似于列表。例如

  1. 高达£5
  2. 马达加斯加£5
  3. 发现Nemo£5
  4. 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

目前还不清楚你想要在你的行中显示什么,但假设你想要一个渐进数字,MovieName及其用当前货币符号格式化的成本,你可以直接使用AppendFormat方法和复合规则格式化

for (int i = 0; i < CartList.CartList.Count(); i++)
{
    Movies Movie = CartList.CartList[i];
    sb.AppendFormat("{0}.\t{1}\t{2:C}\n", i+1, Movie.MovieName, Movie.MovieCost);
}

这里的关键点是string.Format和StringBuilder.AppendFormat都需要一个格式字符串,其中占位符嵌入花括号({0}....{1})中,其中将插入格式说明符后面的参数。

See Composite Formatting

但是,您的问题是将整个stringbuilder添加为单个项目引起的。换行符不会将字符串分成两部分,它会被列表框项集合忽略。 您需要一次添加一个项目。 (或查看Mr. Carey)的答案

private void DisplayCart()
{
    lstCart.Items.Clear();
    CartClass CartList = CartClass.GetCart();
    for (int i = 0; i < CartList.CartList.Count(); i++)
    {
        Movies Movie = CartList.CartList[i];
        lstCart.Items.Add(string.Format("{0}.\t{1}\t{2:C}", 
                           i+1, Movie.MovieName, Movie.MovieCost);
    }
}

答案 1 :(得分:2)

假设您使用ASP.Net ListBox控件......

根据HTML规范,任何一个或多个空格字符保存&nbsp;的序列在HTML页面上显示时会折叠为单个SP(0x20)字符。因此,区分HT(制表符)和SP没有多大意义。

您可能想要做的是使用数据绑定来填充列表框。在这种情况下,您的代码会变成这样:

CartClass          cart   = CartClass.GetCart() ;
IEnumerable<Movie> movies = cart.CartList ;
lstCart.DataSource        = movies;
lstCart.DataTextField     = <property-to-be-displayed-to-user>
lstCart.DataValueField    = <property-to-be-used-when-item-is-selected>
lstCart.DataBind(); 

如果你真的想格式化一个字符串,你可能会看到这样的事情:

public string Display()
{
  CartClass cart = CartClass.GetCart();
  StringBuilder sb = new StringBuilder();
  for ( int i = 0 ; i < cart.CartList.Count() ; i++ )
  {
    Movie movie = cart.CartList[i];
    sb.AppendFormat("{0}.\t{1}\t{2:C}" , i+1 , movie.MovieName , movie.MovieCost ).AppendLine() ;
  }
  return sb.ToString();
}

C格式说明符是“currency”。假设您在英国,您的默认CultureInfo应将电影费用格式化为适当的英国价格/货币价值。

答案 2 :(得分:2)

假设您想要将每个影片与购物车列表分开并将每个影片作为项目添加到ListBox,您可以在for循环中使用yield return来输出可枚举而不是复合字符串,然后您可以枚举列表将每个项目添加到ListBox。

您可以执行以下操作:

    public IEnumerable<string> Display()
    {
        CartClass CartList = CartClass.GetCart();

        for (int i = 0; i < CartList.CartList.Count(); i++)
        {
            Movies Movie = CartList.CartList[i];
            yield return String.Format(i + 1 + "." + "\t" 
                + Movie.MovieName + "\t" + "£" + Movie.MovieCost.ToString() + "\n" );
        }
    }

然后在DisplayCart函数中:

    private void DisplayCart()
    {
        lstCart.Items.Clear();

        foreach (var movie in cart.Display())
        {
            lstCart.Items.Add(movie);
        }
    }