格式化值之间具有相同间距的C#字符串

我有3个字符串。 第一组字符串是:

"1.0536" "2.1" "2" 

第二个是这样的:

 "Round" "Square" "Hex" 

最后是:

 "6061-T6" "T351" "ASF.3.4.5" 

我需要将三个字符串组合在一起,每个字符串之间的间距相同。 我不能使用\ t进行Tab键,因为在我组合字符串后,我将它们发送到Access数据库。

当我组合它们看起来像:

 "1.0536 Round 6061-T6" "2.1 Square T351" "2 Hex ASF.3.4.5" 

我真的希望它们看起来像这样,每个字符串之间的间距相同:

“1.0536 Round 6061-T6”
“2.1 Square T351”
“2 Hex ASF.3.4.5”

我怎么能用C#做到这一点?

您可以使用string.Format 高级function :

 string.Format("{0,-10}{1,-10}{2}", ...) 

您可以通过编写str.PadRight(10)来做同样的事情

如果您知道每列的最大长度,请执行以下操作:

 String result = String.Format("{0} {1} {2}", strCol1.PadRight(10), strCol2.PadRight(9), strCol3.PadRight(9)); 

为了让生活更轻松,实用方法:

用法

 var data = new[] { new[] { "ID", "NAME", "DESCRIPTION" }, new[] { "1", "Frank Foo", "lorem ipsum sic dolor" }, new[] { "2", "Brandon Bar", "amet forthrightly" }, new[] { "3", "B. Baz", "Yeehah!" } }; var tabbedData = EvenColumns(20, data); var tabbedData2 = string.Join("\n", EvenColumns(20, false, data)); // alternate line separator, alignment 

结果

 ID NAME DESCRIPTION 1 Frank Foo lorem ipsum sic dolor 2 Brandon Bar amet forthrightly 3 B. Baz Yeehah! ID NAME DESCRIPTION 1 Frank Foolorem ipsum sic dolor 2 Brandon Bar amet forthrightly 3 B. Baz Yeehah! 

 public string EvenColumns(int desiredWidth, IEnumerable> lists) { return string.Join(Environment.NewLine, EvenColumns(desiredWidth, true, lists)); } public IEnumerable EvenColumns(int desiredWidth, bool rightOrLeft, IEnumerable> lists) { return lists.Select(o => EvenColumns(desiredWidth, rightOrLeft, o.ToArray())); } public string EvenColumns(int desiredWidth, bool rightOrLeftAlignment, string[] list, bool fitToItems = false) { // right alignment needs "-X" 'width' vs left alignment which is just "X" in the `string.Format` format string int columnWidth = (rightOrLeftAlignment ? -1 : 1) * // fit to actual items? this could screw up "evenness" if // one column is longer than the others // and you use this with multiple rows (fitToItems ? Math.Max(desiredWidth, list.Select(o => o.Length).Max()) : desiredWidth ); // make columns for all but the "last" (or first) one string format = string.Concat(Enumerable.Range(rightOrLeftAlignment ? 0 : 1, list.Length-1).Select( i => string.Format("{{{0},{1}}}", i, columnWidth) )); // then add the "last" one without Alignment if(rightOrLeftAlignment) { format += "{" + (list.Length-1) + "}"; } else { format = "{0}" + format; } return string.Format(format, list); } 

具体问题

 // for fun, assume multidimensional declaration rather than jagged var data = new[,] { { "1.0536", "2.1", "2" }, { "Round", "Square", "Hex" }, { "6061-T6", "T351", "ASF.3.4.5" }, }; var tabbedData = EvenColumns(20, Transpose(ToJaggedArray(data))); 

Transpose

 public T[][] Transpose(T[][] original) { // flip dimensions var h = original.Length; var w = original[0].Length; var result = new T[h][]; for (var r = 0; r < h; r++) { result[r] = new T[w]; for (var c = 0; c < w; c++) { result[r][c] = original[c][r]; } } return result; } 

和多维数组( 源 ):

 public T[][] ToJaggedArray(T[,] multiArray) { // via https://stackoverflow.com/questions/3010219/jagged-arrays-multidimensional-arrays-conversion-in-asp-net var h = multiArray.GetLength(0); var w = multiArray.GetLength(1); var result = new T[h][]; for (var r = 0; r < h; r++) { result[r] = new T[w]; for (var c = 0; c < w; c++) { result[r][c] = multiArray[r, c]; } } return result; } 

使用String.Format("{0,10}", myString)
其中10是你想要的字符数

为了更加动态地做,你可以这样做:(硬编码!)

  int padding = 3; int maxCol0width = "Hello World!".Length; int maxCol1width = "90.345".Length; int maxCol2width = "value".Length; string fmt0 = "{0,-" + (maxCol0width + padding) + "}"; string fmt1 = "{1,-" + (maxCol1width + padding) + "}"; string fmt2 = "{2,-" + (maxCol2width + padding) + "}"; string fmt = fmt0 + fmt1 + fmt2; Console.WriteLine(fmt, "Hello World!", 90.345, "value"); Console.WriteLine(fmt, "Hi!", 1.2, "X"); Console.WriteLine(fmt, "Another", 100, "ZZZ"); 

当然,您需要通过循环每个列的值来计算出最大字宽。 此外,格式字符串的创建可以显着清理和缩短。

另请注意,您需要使用非比例字体进行显示,否则您的列仍然无法正常排列。 你在哪里显示这些数据? 获得表格输出可能有更好的方法。

我知道这个问题早已得到解答,但是从C#6.0开始,还有一种新方法

 string[] one = new string[] { "1.0536", "2.1", "2" }; string[] two = new string[] { "Round", "Square", "Hex" }; string[] three = new string[] { "1.0536 Round 6061-T6", "2.1 Square T351", "2 Hex ASF.3.4.5" }; for (int i = 0; i < 3; i++) Console.WriteLine($"{one[i],-10}{two[i],-10}{three[i],-10}"); 

$"{one[i],-10}{two[i],-10}{three[i],-10}"是string.format的新替代品。 我发现它在我的许多项目中非常有用。 以下是c#6.0中有关字符串插值的更多信息的链接: https : //docs.microsoft.com/en-us/dotnet/csharp/tutorials/string-interpolation