【问题标题】:formatting string builder in a For loop在 For 循环中格式化字符串生成器
【发布时间】:2014-04-16 01:51:08
【问题描述】:

我的网络表单有一个函数,它使用 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());
}

我的结果是这样

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

  1. 上涨 5 英镑
  2. 马达加斯加 £5
  3. 海底总动员 5 英镑

我该如何解决这个问题?

【问题讨论】:

  • 有一个 sb.AppendLine() 方法我认为这将有助于换行
  • sb.AppendFormat(是你的朋友
  • 我不确定为什么在手动连接时使用String.Format

标签: c# asp.net css


【解决方案1】:

不清楚你想在你的行中显示什么,但假设你想要一个累进数字,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

但是,您的问题是由于将整个字符串生成器添加为一个项目引起的。换行符不会将您的字符串分成两部分,它只是被列表框项目集合忽略。 您需要一次添加一项。 (或者看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);
    }
}

【讨论】:

  • 好的,可以添加@ConradFrix,现在修复
  • @Steve 您的解决方案几乎可以正常工作并提供了一个很好的格式,但是 \n 没有提供我真正想要的新行。还有其他提示吗?
  • 不,我只是在更新答案,您需要一次添加一项。不尝试将字符串生成器的全部内容添加为列表框中的一项。我已经删除了 Display 方法并在 DisplayCart 中完成了所有工作
【解决方案2】:

假设您想将每部电影从购物车列表中分离出来,并将每部电影作为一个项目添加到 ListBox,您可以使用 for 循环中的 yield return 来输出可枚举而不是复合字符串,然后您可以枚举list 将每个项目添加到 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);
        }
    }

【讨论】:

  • 这个解决方案效果很好!我会为格式添加一些小的调整,但除此之外,非常感谢!谢谢
【解决方案3】:

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

好吧,根据 HTML 规范,任何包含 1 个或多个空格字符的序列(除了 &amp;nbsp;)在 HTML 页面上显示时都会折叠为单个 SP (0x20) 字符。所以区分 HT (tab) 和 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 格式说明符是“货币”。假设您在英国,您的默认 CultureInfo 应该将电影成本格式化为适当的英国价格/货币值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多