(百分求助)C# Winform下数字转中文及排序问题。

xiaopei711 2009-08-10 12:52:52
我有一个datagridview,里面有两列数据:代码和名称
如下
代码 名称
11 加班费
111 加班费
1112 加班费
112 加班费
1122 加班费
1124 加班费
11242 加班费
14 加班费
141 加班费
142 加班费
1421 加班费
1422 加班费
1431 加班费
14311 加班费
14312 加班费
然后,以第一行代码为基准,凡是代码长度跟他一样长的,在一起排序,在“名称”前加:一、二...二十三....
接着,看第二行代码长度是否比他长,如果是,且此行代码的开头跟他一样,则另外排序,名称前加:(一)(二)。。。
以此类推。一共四级:一、(一)、1、(1)。
最后结果如下:
代码 名称
11 一、加班费
111 (一)、加班费
1112 1、加班费
112 (二)、加班费
1122 2、加班费
1124 3、加班费
11242 (1)、加班费
14 二、加班费
141 (一)、加班费
142 (二)、加班费
1421 1、加班费
1422 2、加班费
1431 3、加班费
14311 (1)、加班费
14312 (2)、加班费

具体怎样实现?
这里面设计字符串转换,和排序问题,望各位大侠不吝指教!!!
谢谢。
...全文
223 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿绦 2009-08-10
  • 打赏
  • 举报
回复
只有自己 找规律实现
或者手动的处理


绿绦工作室
ztenv 2009-08-10
  • 打赏
  • 举报
回复
找到规律就自己转呗,
xiaopei711 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wmjcnn 的回复:]
楼主,你好贪哦...BitCoffee都帮你解决问题了,你还要怎样啊?
[/Quote]
汗一个...........
刚学不久,啥都不懂,前辈们多提携提携啊!
BitCoffee 2009-08-10
  • 打赏
  • 举报
回复
//替换上面的方法
public string NumToStr(int num, int type)
{
if (type == 1)
{
//调用数字转大写的类
转大写的类 类 = new 转大写的类();
string str = 类.NumToChn(num.ToString());
return str + "、";
}
else if (type == 2)
{
//调用数字转大写的类
转大写的类 类 = new 转大写的类();
string str = 类.NumToChn(num.ToString());
return "(" + str + ")、";
}
else if (type == 3)
{
return num.ToString() + "、";
}
else if (type == 4)
{
return "(" + num.ToString() + ")、";
}
}
BitCoffee 2009-08-10
  • 打赏
  • 举报
回复
//一个数字转大写的类
public class Money
{
public Money()
{
//
// TODO: Add constructor logic here
//
}
private char 转换数字(char x)
{
string stringChnNames = "零一二三四五六七八九";
string stringNumNames = "0123456789";
return stringChnNames[stringNumNames.IndexOf(x)];
}
private string 转换万以下整数(string x)
{
string[] stringArrayLevelNames = new string[4] { "", "十", "百", "千" };
string ret = "";
int i;
for (i = x.Length - 1; i >= 0; i--)
if (x[i] == '0')
ret = 转换数字(x[i]) + ret;
else
ret = 转换数字(x[i]) + stringArrayLevelNames[x.Length - 1 - i] + ret;
while ((i = ret.IndexOf("零零")) != -1)
ret = ret.Remove(i, 1);
if (ret[ret.Length - 1] == '零' && ret.Length > 1)
ret = ret.Remove(ret.Length - 1, 1);
if (ret.Length >= 2 && ret.Substring(0, 2) == "一十")
ret = ret.Remove(0, 1);
return ret;
}
private string 转换整数(string x)
{
int len = x.Length;
string ret, temp;
if (len <= 4)
ret = 转换万以下整数(x);
else if (len <= 8)
{
ret = 转换万以下整数(x.Substring(0, len - 4)) + "万";
temp = 转换万以下整数(x.Substring(len - 4, 4));
if (temp.IndexOf("千") == -1 && temp != "")
ret += "零" + temp;
else
ret += temp;
}
else
{
ret = 转换万以下整数(x.Substring(0, len - 8)) + "亿";
temp = 转换万以下整数(x.Substring(len - 8, 4));
if (temp.IndexOf("千") == -1 && temp != "")
ret += "零" + temp;
else
ret += temp;
ret += "万";
temp = 转换万以下整数(x.Substring(len - 4, 4));
if (temp.IndexOf("千") == -1 && temp != "")
ret += "零" + temp;
else
ret += temp;
}
int i;
if ((i = ret.IndexOf("零万")) != -1)
ret = ret.Remove(i + 1, 1);
while ((i = ret.IndexOf("零零")) != -1)
ret = ret.Remove(i, 1);
if (ret[ret.Length - 1] == '零' && ret.Length > 1)
ret = ret.Remove(ret.Length - 1, 1);
return ret;
}

private string 转换小数(string x)
{
string ret = "";
for (int i = 0; i < x.Length; i++)
ret += 转换数字(x[i]);
return ret;
}

public string NumToChn(string x)
{
if (x.Length == 0)
return "";
string ret = "";
if (x[0] == '-')
{
ret = "负";
x = x.Remove(0, 1);
}
if (x[0].ToString() == ".")
x = "0" + x;
if (x[x.Length - 1].ToString() == ".")
x = x.Remove(x.Length - 1, 1);
if (x.IndexOf(".") > -1)
ret += 转换整数(x.Substring(0, x.IndexOf("."))) + "点" + 转换小数(x.Substring(x.IndexOf(".") + 1));
else
ret += 转换整数(x);
return ret;
}
}
wmjcnn 2009-08-10
  • 打赏
  • 举报
回复
楼主,你好贪哦...BitCoffee都帮你解决问题了,你还要怎样啊?
xiaopei711 2009-08-10
  • 打赏
  • 举报
回复
楼上高人,你的代码我运行了,确实效果很好,谢谢先!
还是老问题,有没有好一点方法实现百位数据的转换?
麻烦老兄了!
BitCoffee 2009-08-10
  • 打赏
  • 举报
回复
1.DataGridView排序,转换之前,先点一下代码列的列头,注意此排序不是按照数字大小来排序的.它会很规则的将你的代码数据列排列成树结构。
if (dgv.Rows[i].Cells["代码"].Value.ToString().Length == 2)
{
n1 += 1;
//这里就已经重新开始排序了
n2 = 0;
n3 = 0;
n4 = 0;
dgv.Rows[i].Cells["名称"].Value = NumToStr(n1,1) + dgv.Rows[i].Cells["名称"].Value;
}

2.至于有几百条,那么则自己补充数组.
string[] str = { "", "一", "二", "三", "四", "五", "六", "七", "八", "九","十",…… };
xiaopei711 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bitcoffee 的回复:]
C# codepublicvoid FormatTo(DataGridView dgv)
{int n1=0;int n2=0;int n3=0;int n4=0;for (int i=0; i< dgv.RowCount; i++)
{if (dgv.Rows[i].Cells["代码"].Value.ToString().Length==2)
¡­
[/Quote]
首先感谢这位兄弟!
怪我没说明白,虽然是分成四组排序,但从第二组开始,排序的时候,要看他的上级是不是一样(也就是会说11和14的下面的第二组是从新开始排序的),这个问题怎么解决?例子如下,以前那个有点问题:现在毫无头绪,望指点。
代码 名称
11 一、加班费
111 (一)、加班费
1112 1、加班费
112 (二)、加班费
1122 1、加班费
1124 2、加班费
11242 (1)、加班费
14 二、加班费
141 (一)、加班费
142 (二)、加班费
1421 1、加班费
1422 2、加班费
1431 3、加班费
14311 (1)、加班费
14312 (2)、加班费

还有,我的数据有几百条,数字怎么转换?望大侠赐教!
BitCoffee 2009-08-10
  • 打赏
  • 举报
回复
由于DataGridView表头可以排序的,所以不用判断代码开头是不是一样的
qk81433373 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bitcoffee 的回复:]
C# codepublicvoid FormatTo(DataGridView dgv)
{int n1=0;int n2=0;int n3=0;int n4=0;for (int i=0; i< dgv.RowCount; i++)
{if (dgv.Rows[i].Cells["代码"].Value.ToString().Length==2)
¡­
[/Quote]
这样没法判断代码开头是不是一样的,然后再重新开一列啊, 这样只能得到一列,而且是根据代码的长短来排的!
xxxxxchener 2009-08-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bitcoffee 的回复:]
C# codepublicvoid FormatTo(DataGridView dgv)
{int n1=0;int n2=0;int n3=0;int n4=0;for (int i=0; i< dgv.RowCount; i++)
{if (dgv.Rows[i].Cells["代码"].Value.ToString().Length==2)
¡­
[/Quote]

6楼的很详细了。你自己看一看。估计没什么问题了。
BitCoffee 2009-08-10
  • 打赏
  • 举报
回复
public void FormatTo(DataGridView dgv)
{
int n1 = 0;
int n2 = 0;
int n3 = 0;
int n4 = 0;
for (int i = 0; i < dgv.RowCount; i++)
{
if (dgv.Rows[i].Cells["代码"].Value.ToString().Length == 2)
{
n1 += 1;
n2 = 0;
n3 = 0;
n4 = 0;
dgv.Rows[i].Cells["名称"].Value = NumToStr(n1,1) + dgv.Rows[i].Cells["名称"].Value;
}
else if (dgv.Rows[i].Cells["代码"].Value.ToString().Length == 3)
{
n2 += 1;
dgv.Rows[i].Cells["名称"].Value = NumToStr(n2, 2) + dgv.Rows[i].Cells["名称"].Value;
}
else if (dgv.Rows[i].Cells["代码"].Value.ToString().Length == 4)
{
n3 += 1;
dgv.Rows[i].Cells["名称"].Value = NumToStr(n3, 3) + dgv.Rows[i].Cells["名称"].Value;
}
else if (dgv.Rows[i].Cells["代码"].Value.ToString().Length == 5)
{
n4 += 1;
dgv.Rows[i].Cells["名称"].Value = NumToStr(n4, 4) + dgv.Rows[i].Cells["名称"].Value;
}
}
}

public string NumToStr(int num,int type)
{
if (type == 1)
{
string[] str = {"","一","二","三","四","五","六","七","八","九" };
return str[num] + "、";
}
else if (type == 2)
{
string[] str = { "", "(一)", "(二)", "(三)", "(四)", "(五)", "(六)", "(七)", "(八)", "(九)" };
return str[num] + "、";
}
else if (type == 3)
{
string[] str = { "", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
return str[num] + "、";
}
else if (type == 4)
{
string[] str = { "", "(1)", "(2)", "(3)", "(4)", "(5)", "(6)", "(7)", "(8)", "(9)" };
return str[num] + "、";
}
}
qk81433373 2009-08-10
  • 打赏
  • 举报
回复

感觉 你这个有点类似生成动态树一样,从一张表中读数据,生成一动态树,可以这样设计表结构
编码 名称 父编码 等级
01 江苏 <空> 0
0101 南京 01 1
0102 苏州 01 1
010101 鼓楼区 0101 2
02 山东 <空> 0
0201 济南 02 1

读表时在根据你的要求添加你想要做的功能
lxxlql 2009-08-10
  • 打赏
  • 举报
回复
建议你还是去数据库处理
hecker728 2009-08-10
  • 打赏
  • 举报
回复
去数据库中处理,C#中处理比较麻烦,效率也低

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧