格式化字符串
我想输出格式对齐的表格,如下:姓名 住址 年龄
张三 XX街道XX号 1
利四 某某市XX街道XX号 1
王五 某某某市XX街道XX号 1
我想到的是用格式化字符串string.Format("{0,20}{1,30}{2,4}",Name,Addr,Age); //仅为举例
但是后来我发现,在补齐长度的时候,中文字符算是1个单位,不足的部分用的是英文的空格补齐的所有虽然都是相同的单位长度(比如Addr都是30个长度),但是里面包含中文字符多的,在显示上明显就长出很多,根本对不齐,请问怎么解决呢?(用\t也不理想因为如果一组字串地长度如果大于一个\t的长度的话就不行了),请大家指点下。谢谢。 --------------------编程问答-------------------- 显示出来已经对不齐了。。。我显示的环境是winform的richtextbox。 --------------------编程问答-------------------- winform中有个TableLayoutPanel,为什么要用RichTextBox呢? --------------------编程问答-------------------- 画个表格吧! --------------------编程问答--------------------
用datagridview控件来显示 --------------------编程问答-------------------- 我只是想知道,遇到类似的情况如何处理而已,这只是一个例子。也就是简单的输出格式化而已(因为要求不复杂,对齐而已,只是加入了中文和英文,不知道是否有解决方法)。看看如何实现。并不是说用什么DataGridView什么的不能实现。谢谢。 --------------------编程问答-------------------- 看看、、我也在找这个问题 --------------------编程问答-------------------- 想输出表格样式的结果,既然你不用datagridview,那就是想在屏幕上显示了。
那就要用点心思了。首先估算出字段内容的最大长度,留下足够的空间,免得挤压下一个字段的位置。
其次,统一使用全角空格字符,解决上下对齐问题 --------------------编程问答--------------------
的确,这样是一种方法,但是如果全部是全角有如下问题:
1)不美观,英文、标点,看起来并不舒服
2)与实际不符,如果别人copy了,那么也是全角的,到其他地方可能不能用。
半角+全角就没啥解决方法么?有无计算像素长度的方法。。。 --------------------编程问答--------------------
只能预留足够多的位置~ --------------------编程问答-------------------- 补空格只在,等宽字符集字体的情况下有用,例如以前DOS系统的25×80屏幕。但window时代,就算是全英文,采用的也不是等宽字符字体,所以补空格调整显示对齐这种方式就不要考虑了。 --------------------编程问答-------------------- 对,明显英文字母像素宽度就不同,但是还是有\t这样的制表符存在,证明还是有方法,那当有这样的需要的时候,应该如何去实现呢? --------------------编程问答-------------------- 用\t,字符串大于\t的话就用两个\t,然后剩下来的问题就是如何计算字符串长度,Graphics有MeasureString的方法。 --------------------编程问答--------------------
using System;--------------------编程问答-------------------- 运行结果 --------------------编程问答-------------------- 代码略显累赘,没整理,见谅... --------------------编程问答--------------------
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
PersonMessage p1 = new PersonMessage("张三", "XX街道XX号", "1");
PersonMessage p2 = new PersonMessage("利四", "某某市XX街道XX号", "1");
PersonMessage p3 = new PersonMessage("王五", "某某某市XX街道XX号", "1");
A a1 = a(p1.Address);
A a2 = a(p2.Address);
A a3 = a(p3.Address);
string s1 = string.Format("{0,20}{1," + a1.sum + "}{2,4}", p1.Name, p1.Address, p1.Age);
string s2 = string.Format("{0,20}{1," + a2.sum + "}{2,4}", p2.Name, p2.Address, p2.Age);
string s3 = string.Format("{0,20}{1," + a3.sum + "}{2,4}", p3.Name, p3.Address, p3.Age);
string [] str=new string []{s1 ,s2 ,s3 };
this.richTextBox1.Lines = str;
}
public A a(string s)
{
int i = 0;
string sEnd;
int sum;
string[] str = Regex.Split(s , "市", RegexOptions.IgnoreCase);
switch (str.Length)
{
case 1:
string[] str1 = Regex.Split(s, "街道", RegexOptions.IgnoreCase);
i += str1[0].Length + str1[1].Length - 1;
break;
case 2:
string[] str2 = Regex.Split(str[1], "街道", RegexOptions.IgnoreCase);
i += str2[0].Length + str2[1].Length - 1;
break;
case 3:
string[] str3 = Regex.Split(str[2], "街道", RegexOptions.IgnoreCase);
i += str3[0].Length + str3[1].Length - 1;
break;
case 4:
string[] str4 = Regex.Split(str[3], "街道", RegexOptions.IgnoreCase);
i += str4[0].Length + str4[1].Length - 1;
break;
}
sEnd = s;
sum = (15 - s.Length ) * 2 - i+s .Length ;
for (int j = 0; j < sum ; j++)
{
sEnd += " ";
}
A a = new A(sum, sEnd);
return a;
}
public class A
{
public int sum;
public string sEnd;
public A(int i, string send)
{
this.sum = i;
this.sEnd = send;
}
}
public class PersonMessage
{
public string Name;
public string Address;
public string Age;
public PersonMessage(string name, string address, string age)
{
this.Name = name;
this.Address = address;
this.Age = age;
}
}
}
简单的输出,所以你应该用直截了当的Grid(网格)思路。
我们编程是要追求简单,但是成事不足败事有余的简单是不能追求的。
补充:.NET技术 , C#