【问题标题】:Format a string into columns将字符串格式化为列
【发布时间】:2010-06-04 23:00:48
【问题描述】:

有没有一种很酷的方法来采取这样的方式:

客户姓名 - 城市、州 - ID
Bob Whiley - 田纳西州豪斯维尔 - 322
马利温彻斯特 - 加利福尼亚州老城 - 5653

并将其格式化为:

客户姓名 - 城市、州 - ID
Bob Whiley - 田纳西州豪斯维尔 - 322
马利温彻斯特 - 加利福尼亚州老城 - 5653

使用字符串格式命令?

如果一篇文章很长,我不会太担心该怎么做。例如,我可以这样做:

客户姓名 - 城市、州 - ID
Bob Whiley - 田纳西州豪斯维尔 - 322
马利温彻斯特 - 加利福尼亚州老城 - 5653
Super Town 人 - Long Town Name, WA- 45648

提供一些上下文。我有一个下拉框,显示与此非常相似的信息。现在我在下拉菜单中创建项目的代码如下所示:

public partial class CustomerDataContract
{
    public string DropDownDisplay
    {
        get
        {
             return  Name + " - " + City + ",  " + State + " - " + ID;
        }
    }
}

我正在寻找一种更好地格式化它的方法。有什么想法吗?


这就是我最终的结果:

HttpContext.Current.Server.HtmlDecode(
    String.Format("{0,-27} - {1,-15}, {2, 2} - {3,5}", 
    Name, City, State, ID)
    .Replace(" ", " "));

HtmlDecode 将   更改为可以承受下拉列表的空格删除格式的空格。

【问题讨论】:

    标签: c# string string-formatting


    【解决方案1】:

    您可以使用Console.WriteLineString.Format 指定文本占用的列数以及对齐方式:

    // Prints "--123       --"
    Console.WriteLine("--{0,-10}--", 123);
    // Prints "--       123--"
    Console.WriteLine("--{0,10}--", 123);
    

    数字指定要使用的列数,符号指定对齐方式(- 用于左对齐,+ 用于右对齐)。所以,如果你知道可用的列数,你可以这样写:

    public string DropDownDisplay { 
      get { 
        return String.Format("{0,-10} - {1,-10}, {2, 10} - {3,5}"),
          Name, City, State, ID);
      } 
    } 
    

    如果您想根据整个列表(例如最长的名称)计算列数,那么您需要提前获取该数字并将其作为参数传递给您的 DropDownDisplay - 那里无法自动执行此操作。

    【讨论】:

    • 好答案!我认为它有效,但由于某种原因,当查看下拉菜单时,它不起作用。我猜有些东西正在删除多余的空格。 :(
    • 我需要想办法插入  而不是空格。
    • 如果你需要使用 ,只要做一个字符串。格式后替换。 return String.Format("{0,-10} - {1,-10}, {2, 10} - {3,5}"), Name, City, State, ID).Replace(" ", "&nbsp ;");
    • 这就是我最终得到的结果: HttpContext.Current.Server.HtmlDecode( String.Format("{0,-27} - {1,-15}, {2, 2} - { 3,5}", 姓名, 城市, 州, ID).Replace(" ", " "));
    【解决方案2】:

    除了 Tomas 的回答,我只想指出,字符串插值可用于 C# 6 或更高版本。

    // with string format
    var columnHeaders1 = string.Format($"|{0,-30}|{1,-4}|{2,-15}|{3,-30}|{4,-30}|{5,-30}|{6,-30}", "ColumnA", "ColumnB", "ColumnC", "ColumnD", "ColumnE", "ColumnF", "ColumnG");
    
    // with string interpolation
    var columnHeaders2 = $"|{"ColumnA",-30}|{"ColumnB",-4}|{"ColumnC",-15}|{"ColumnD",-30}|{"ColumnE",-30}|{"ColumnF",-30}|{"ColumnG",-30}";
    

    【讨论】:

      【解决方案3】:

      我无法在上面添加评论,但在接受的答案中指出:

      如果您想根据整个列表(例如最长的名称)计算列数,那么您需要提前获取该数字并将其作为参数传递给您的 DropDownDisplay - 无法自动执行此操作

      这实际上可以在运行时通过“即时”创建格式字符串以编程方式完成:

      string p0 = "first";
      string p1 = "separated by alignment value x";
      
      int x = n * 10; // calculate the alignment x as needed
      
      // now use x to give something like: {0,-20}, {1}
      string fmt = "{0,-" + x + "},{1}"; // or whatever formatting expression you want
      
      // then use the fmt string
      string str = string.Format(fmt, p0, p1)
      
      // with n = 2 this would give us
      "first               ,separated by alignment value x"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-16
        • 2019-06-03
        相关资源
        最近更新 更多