首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在For循环中格式化字符串生成器

在For循环中格式化字符串生成器
EN

Stack Overflow用户
提问于 2014-04-15 17:12:58
回答 3查看 1.3K关注 0票数 2

我的webform有一个函数,它使用for循环输出购物车中的每个项目。但是,我的问题是格式化这个字符串,以便它包含制表符空间,并为购物车中的每一项添加一个新行。我的代码如下:

代码语言:javascript
复制
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中输出此字符串。

代码语言:javascript
复制
private void DisplayCart()
{
    lstCart.Items.Clear();
    lstCart.Items.Add(cart.Display());
}

我出来的是这个

我想要格式类似于一个列表。例如

  1. 上5
  2. 马达加斯加£5
  3. 查找Nemo£5

我怎么才能解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-15 17:36:47

假设您希望将每个电影从购物车列表中分离出来,并将每个电影作为一个项添加到ListBox中,则可以使用for循环中的收益率返回来输出一个可枚举的字符串,而不是一个复合字符串,然后可以枚举该列表以将每个项添加到ListBox中。

你可以这样做:

代码语言:javascript
复制
    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函数中:

代码语言:javascript
复制
    private void DisplayCart()
    {
        lstCart.Items.Clear();

        foreach (var movie in cart.Display())
        {
            lstCart.Items.Add(movie);
        }
    }
票数 2
EN

Stack Overflow用户

发布于 2014-04-15 17:17:44

不清楚您希望在行中显示什么,但假设您希望使用累进数字、MovieName及其用当前货币符号格式化的成本,则可以直接使用AppendFormat方法和复合格式规则。

代码语言:javascript
复制
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})的占位符,其中将插入格式说明符后面的参数。

参见复合格式

但是,您的问题是由于将整个字符串生成器添加为一个单一项而引起的。换行符不会将字符串分成两部分,它只是被列表框项集合忽略了。您需要同时添加一个项目。(或者看看凯里先生的答案)

代码语言:javascript
复制
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);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2014-04-15 17:26:56

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

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

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

代码语言:javascript
复制
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(); 

如果您真的想格式化一个字符串,您可能会看到这样的操作:

代码语言:javascript
复制
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应该将电影成本格式化为适当的英国价格/货币价值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23090247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档