| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1261 人关注过本帖
标题:C#写的 将数字金额转换中文大写 函数
只看楼主 加入收藏
hexiemoling
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-7-3
收藏
 问题点数:0 回复次数:0 
C#写的 将数字金额转换中文大写 函数

基本考虑:
人民币大写单位银行规定用“元”
无零头金额后跟“整”,有则不跟
角为零时不写角(如:零叁分)四舍五入到分
为减少判读疑惑(一般对大写金额预期较高)和体现人民币基本单位为元,金额低于壹圆前仍加“零元”
整数转换 若干零后若跟非零值,只显示一个零,否则不显示
万(亿)前有零后不加零,因亿、万为一完整单位(如:拾万贰仟 比 拾万零贰仟 更顺些)
亿为汉语计数最大单位,只要进位到总是显示(如:壹亿亿)
万为次最大单位,亿万之间必须有非零值方显示万(如“壹亿”不可显示为“壹亿万”)
为减少被窜改的可能性,十进位总发壹音,这和下面的习惯读法不一样(十进位处于第一位不发壹音,如“拾元”非“壹拾元”,十进位处前有零是否不发壹音不太确定,如“叁仟零壹拾元”还是“叁仟零拾元”?)。 用“拾万”不用“壹拾万”,因为每个整数进位后都有进位单位(拾佰仟万亿), 这样即使金额前没有附防窜改的前缀如“人民币”字样也难窜改些。因为至少要加添两个汉字并且改动后数字必须进位才能窜改成(如“拾万”可改成“叁拾万”,而“壹拾万”至少要改成“壹佰壹拾万”)
此函数为Borland C++ Builder编写,已充分考虑到跨平台兼容性,如需转换到其它场合,只需修改字符串类型从AnsiString到对应的类型、功能及函数(注意两个char*型字符串不可以直接相加,需有一个先转换)
源代码:
using System;
private static string[] HanDigiStr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private static string[] HanDiviStr = { "","拾","佰","仟","万","拾","佰","仟","亿",
"拾","佰","仟","万","拾","佰","仟","亿",
"拾","佰","仟","万","拾","佰","仟" };
public static string NumToRMBStr(double val)
{ if(val>100000000000) return "数字过大!"; //不小于千亿(可以更大点但没有什么意义了)
string SignStr="",TailStr="";
double fraction=0;
Int64 integer=0;
if( val<0 )
{ val = -val; SignStr = "负"; }
//整数部分 由于ToInt64本身有四舍五入功能所以要加 val%1 部分
integer=Convert.ToInt64(val-val%1);
int jiao,fen;
fraction = Math.Round(val%1,2); //四舍五入到分在.Net中四舍五入有点争议,它是伍不进位的。
fen = Convert.ToInt32((fraction*100)%10);//分
jiao = Convert.ToInt32((fraction*100-fen)/10);//角
if( jiao==0 && fen==0 )
{ TailStr = "整"; }
else
{ TailStr = HanDigiStr[jiao];
if( jiao!=0 ) TailStr += "角";
if( integer==0 && jiao==0 ) TailStr = ""; // 零元后不写零几分
if( fen!=0 ) TailStr += HanDigiStr[fen] + "分";
}
// 下一行可用于非正规金融场合,0.03只显示“叁分”而不是“零元叁分”
// if( integer==0 ) return SignStr+TailStr;
return SignStr+PositiveIntegerToHanStr( integer.ToString()) + "元" + TailStr;
}


// 输入字符串必须正整数,只允许前导空格(必须右对齐),不宜有前导零
private static string PositiveIntegerToHanStr(string NumStr)
{ string RMBStr="";
int len,n;
bool hasvalue=false,lastzero=false; //亿、万进位前有数值标记
len = NumStr.Length;
for(int i=0;i<len;i++)
{ n = NumStr - '0';
int j=len-i-1;
if( n!=0 )
{ if( lastzero ) RMBStr += HanDigiStr[0]; //若干零后若跟非零值,只显示一个零
//除了亿万前的零不带到后面
// if(!( n==1&&(i%4)==1 &&(lastzero || i==len-1))) //如十进位前有零也不发壹音用此行
// if( !( n==1 && (i%4)==1 && i==len-1 )) //十进位处于第一位不发壹音,
RMBStr += HanDigiStr[n];
RMBStr += HanDiviStr[len-i-1]; //非零值后加进位,个位为空
hasvalue = true; //置万进位前有值标记
}
else
{ if( j==8 || j==4 && hasvalue ) //亿万之间必须有非零值方显示万
RMBStr += HanDiviStr[len-i-1]; //“亿”或“万”
}
if( j%8==0 ) hasvalue = false; // 万进位前有值标记逢亿复位
lastzero = (n==0) && (j%4!=0); // 亿万前有零后不加零,如:拾万贰仟
}
if( RMBStr.Length== ) return HanDigiStr[0]; // 输入空字符或"0",返回"零"
return RMBStr;
}
调用方法:
如: string v_sum;
v_sum = NumToRMBStr(Convert.ToDouble(outBlock.GetColVal(1,"SUM")));

搜索更多相关主题的帖子: 金额 人民币 函数 汉语 数字 
2007-07-03 22:41
快速回复:C#写的 将数字金额转换中文大写 函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022349 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved