ActiveReports 做票据打印中文大写金额的通用方法

项目中使用到ActiveReports做票据,需要打印中文大写金额。可以使用三种办法完成:

1、编写一个数字转金额的通用静态类,然后在需要打印中文大写金额的地方设置DataField属性为:=YourNameSpace.ConvertToChinese(数字字段名)。但是这种方法有一个问题,就是如果数字字段名是一个通过合计计算出来的值,并不是直接从数据源出来的字段,那么这个方法就会执行无效。

2、充分利用ActiveReports的脚本功能,打开脚本编辑器,选择使用C#脚本,然后将转化函数复制进去:
static public string ConvertToChinese(decimal number)
{
    
string numList="零壹贰叁肆伍陆柒捌玖";
    
string rmbList = "分角元拾佰仟万拾佰仟亿拾佰仟万";
    
string tempOutString = "";

    
string tempNumberString=System.Convert.ToInt64(number*100).ToString();
    
int tempNmberLength=tempNumberString.Length;
    
int i=0;
    
if(tempNumberString.StartsWith("-"))
    {
        tempOutString 
= "";
        i
++;
    }
    
while(i<tempNmberLength)
    {
        
int oneNumber=System.Int32.Parse(tempNumberString.Substring(i,1));
        
string oneNumberChar=numList.Substring(oneNumber,1);
        
string oneNumberUnit=rmbList.Substring(tempNmberLength-i-1,1);
        
if(oneNumberChar!="")
            tempOutString
+=oneNumberChar+oneNumberUnit;
        
else
        {
            
if(oneNumberUnit=="亿"||oneNumberUnit==""||oneNumberUnit==""||oneNumberUnit=="")
            {
                
while (tempOutString.EndsWith(""))
                {
                    tempOutString
=tempOutString.Substring(0,tempOutString.Length-1);
                }

            }
            
if(oneNumberUnit=="亿"||(oneNumberUnit==""&&!tempOutString.EndsWith("亿"))||oneNumberUnit=="")
            {
                tempOutString
+=oneNumberUnit;
            }
            
else
            {
                
bool tempEnd=tempOutString.EndsWith("亿");
                
bool zeroEnd=tempOutString.EndsWith("");
                
if(tempOutString.Length>1)
                {
                    
bool zeroStart=tempOutString.Substring(tempOutString.Length-2,2).StartsWith("");
                    
if(!zeroEnd&&(zeroStart||!tempEnd))
                        tempOutString
+=oneNumberChar;
                }
                
else
                {
                    
if(!zeroEnd&&!tempEnd)
                        tempOutString
+=oneNumberChar;
                }
            }
        }
        i
+=1;
    }

    
while (tempOutString.EndsWith(""))
    {
        tempOutString
=tempOutString.Substring(0,tempOutString.Length-1);
    }

    
while(tempOutString.EndsWith(""))
    {
        tempOutString
=tempOutString+"";
    }
    
return tempOutString;
}
        

然后对需要转化成大写金额的TextBox进行格式化,将以下代码也添加到脚本当中(大写金额显示位置代码也略有不同,以下是将大写文本框放在报表页脚的代码):
public void 报表页脚_Format()
{
    DataDynamics.ActiveReports.TextBox tbx1 
= (DataDynamics.ActiveReports.TextBox)rpt.Sections["报表页脚"].Controls[0];
    DataDynamics.ActiveReports.TextBox tbx2 
= (DataDynamics.ActiveReports.TextBox)rpt.Sections["报表页脚"].Controls[1];
    tbx2.Text 
= ConvertToChinese(System.Convert.ToDecimal(tbx1.Text));
}

将转化代码放在脚本当中的好处就是可以随同报表样式保存为*.rpx文件,可以随意分发给用户。
值得注意的一点就是ActiveReport对象在脚本当中是用rpt来表示,可以直接通过rpt访问当前报表。

3、第三种转化方法其实和第二种差不多,就是直接在报表文件映射的类中进行编程,但是这样灵活性不是太好,每个报表都需要做死后进行编译,如果用户提出修改报表的话又得改动程序了。这种方法的代码和第二种类似,这里就不再赘述了。
posted @ 2007-03-25 21:12  Popcorn  阅读(1046)  评论(0)    收藏  举报