当前位置:编程学习 > C#/ASP.NET >>

格式化字符串

我想输出格式对齐的表格,如下:
姓名             住址                    年龄
张三             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呢? --------------------编程问答-------------------- 画个表格吧! --------------------编程问答--------------------
引用 1 楼 windxx 的回复:
显示出来已经对不齐了。。。我显示的环境是winform的richtextbox。

用datagridview控件来显示 --------------------编程问答-------------------- 我只是想知道,遇到类似的情况如何处理而已,这只是一个例子。也就是简单的输出格式化而已(因为要求不复杂,对齐而已,只是加入了中文和英文,不知道是否有解决方法)。看看如何实现。并不是说用什么DataGridView什么的不能实现。谢谢。 --------------------编程问答-------------------- 看看、、我也在找这个问题 --------------------编程问答-------------------- 想输出表格样式的结果,既然你不用datagridview,那就是想在屏幕上显示了。
那就要用点心思了。首先估算出字段内容的最大长度,留下足够的空间,免得挤压下一个字段的位置。
其次,统一使用全角空格字符,解决上下对齐问题 --------------------编程问答--------------------
引用
想输出表格样式的结果,既然你不用datagridview,那就是想在屏幕上显示了。
那就要用点心思了。首先估算出字段内容的最大长度,留下足够的空间,免得挤压下一个字段的位置。
其次,统一使用全角空格字符,解决上下对齐问题 

的确,这样是一种方法,但是如果全部是全角有如下问题:
1)不美观,英文、标点,看起来并不舒服
2)与实际不符,如果别人copy了,那么也是全角的,到其他地方可能不能用。
半角+全角就没啥解决方法么?有无计算像素长度的方法。。。 --------------------编程问答--------------------
引用 5 楼 windxx 的回复:
我只是想知道,遇到类似的情况如何处理而已,这只是一个例子。也就是简单的输出格式化而已(因为要求不复杂,对齐而已,只是加入了中文和英文,不知道是否有解决方法)。看看如何实现。并不是说用什么DataGridView什么的不能实现。谢谢。



只能预留足够多的位置~ --------------------编程问答-------------------- 补空格只在,等宽字符集字体的情况下有用,例如以前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;
            }
        }
    }
--------------------编程问答-------------------- 运行结果 --------------------编程问答-------------------- 代码略显累赘,没整理,见谅... --------------------编程问答--------------------
引用 5 楼 windxx 的回复:
我只是想知道,遇到类似的情况如何处理而已,这只是一个例子。也就是简单的输出格式化而已(因为要求不复杂,对齐而已,只是加入了中文和英文,不知道是否有解决方法)。看看如何实现。并不是说用什么DataGridView什么的不能实现。谢谢。


简单的输出,所以你应该用直截了当的Grid(网格)思路。

我们编程是要追求简单,但是成事不足败事有余的简单是不能追求的。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,