使用制表符或空格格式化文本

Posted

技术标签:

【中文标题】使用制表符或空格格式化文本【英文标题】:Formatting text with tabs or spaces 【发布时间】:2013-06-20 21:29:35 【问题描述】:

我有这样的对象:


 Name: "John"
 Location: "Unknown"
 Type: "Unknown"
 Status: "Unknown"
 Phone_number: "Unknown"

需要这样格式化(使用制表符或空格):

Name:           John // three tabs
Location:       Unknown // two tabs
Type:           Unknown // three tabs
Status:         Unknown // three tabs
Phone_number:   Unknown // one tab

Java 和 Perl 都有这个 functionality in printf,但是如何在 javascript 中做到这一点?

【问题讨论】:

【参考方案1】:

好的。找到here:

/**
 * object.padding(number, string)
 * Transform the string object to string of the actual width filling by the padding character (by default ' ')
 * Negative value of width means left padding, and positive value means right one
 *
 * @param       number  Width of string
 * @param       string  Padding chacracter (by default, ' ')
 * @return      string
 * @access      public
 */
String.prototype.padding = function(n, c)

        var val = this.valueOf();
        if ( Math.abs(n) <= val.length ) 
                return val;
        
        var m = Math.max((Math.abs(n) - this.length) || 0, 0);
        var pad = Array(m + 1).join(String(c || ' ').charAt(0));
//      var pad = String(c || ' ').charAt(0).repeat(Math.abs(n) - this.length);
        return (n < 0) ? pad + val : val + pad;
//      return (n < 0) ? val + pad : pad + val;
;

这不适用于制表符,但与我所描述的空格完全一样。

我的示例代码是:

$.each(myObj, function(myKey, myVal) 

   myOut += myKey.padding(20) + " = " + myVal + "\r\n";

);

输出将是:

Name                 = John
Location             = Unknown
Type                 = Unknown
Status               = Unknown
Phone_number         = Unknown

【讨论】:

这非常有用,但它不适用于一行中的多个填充。【参考方案2】:

编辑您可以使用“\t”添加更多选项卡。每个'\t'表示一个tab,所以在console.log中可以使用更多的console.log(prop + ":\t\t\t" + obj[prop]);

将您的对象传递给此函数(这适用于任何对象):

function printObject(obj)
  for(var prop in obj)
   if (obj.hasOwnProperty(prop)) 
    console.log(prop + ":\t" + obj[prop]);
   
 

您还可以使用

获得非常相似的输出(但带有引号)
JSON.stringify(obj, null, 2); 

这基本上会以 jason 格式打印您的对象,并将使用最后一个参数(2)作为分隔符空格的数量。

【讨论】:

第一个函数只添加一个选项卡,如果键有长字或几个字,一个选项卡就不够了。即使在我的示例中,第一行也需要两个选项卡。 @ancap 你有没有尝试添加更多标签,比如:\t\t,甚至:\t\t\t 我编辑了第一篇文章。正如您在第一行中看到的 - 三个选项卡,第二个 - 两个,第三和第四个 - 三个,第五个 - 一个。【参考方案3】:

String.prototype.padEnd(targetLength, padString) 方法可以完成这项工作,它记录在 here。 如果省略,padString 参数将设置为单空格字符串。

例子:

console.log(`   $'Player'.padEnd(19) ` +
    `$'MATCH'.padEnd(8)  ` +
    `$'SCORE'.padEnd(8)  `
);
for (const player of this.players) 
    console.log(` - $player.name.padEnd(20) ` +
        `$player.matches.length.toString().padEnd(8)  ` +
        `$player.score.toString().padEnd(8)  `
    );

结果:

   Player              MATCH    SCORE   
 - Bradly               5        15      
 - Sam                  4        9       
 - Dew                  3        5     

【讨论】:

更干净的例子jsbin.com 将 myString.padEnd(x) 与等宽字体结合使用是最好的解决方案,应该是公认的答案。

以上是关于使用制表符或空格格式化文本的主要内容,如果未能解决你的问题,请参考以下文章

数据文件的内容中,字段中间用制表符Tab键分隔。

使用制表符和空格读入文件

识别文本中的空格

如何在文本文件中的换行符后抓取文本不清除空格,制表符[关闭]

群体遗传之ped格式

如何将制表符转换为空格并在android studio中保存时自动格式化