大数值金额大写转换(C语言)
关于大数值金额大写转换,在财务管理的应用方面没什么意义。一般来说,千亿级,万亿级的数值就够了。因为在国家级层面是以亿为单位的,也就表达为千万亿,万万亿。在企业层面数值金额转换设置到千亿、万亿就行了。大的集团级企业扩大到万万亿也就行了。做企业应用软件的可根据需要设置。至于再大的数值就是天文数字,有另外的表达方法。
本人喜欢探索各种算法。前些天写了15位数值的金额大写转换。今再尝试写一个更多位数值的换算大写转换。提供给需要的同道参考。
金额大写应用在很多方面,如支票、发票、各种单据,各种财务凭证,合同文本金额部分。财务方面制定了一套标准的表达法。财务上金额大写是没有负数的,财务上分借方和贷方,负数就是借方红字和贷方红字,也就是赤字。大写转换的算法要按财务管理的标准来设置。本文详细介绍算法的要点。
算法的要点:
简单地讲就是字串转换处理。若输入是数值型则转为字串型。
将输入的金额分成整数部分和小数部分,整数部分分段为4位数的万级段,再按金额数值逐位转换成中文,拼成大写字串,然后输出。
对于不含零的情况,直接就转换好了。然而对于含零和连续多个零的情况就要消除多余的零。本文介绍的算法就是 ”截数值位消零法”,或称 ”截位消零法” 。
要处理的是整数部分,分四步:
一是 将整数部分分成整数的前几位字段和后面的4位万级数字段,
二是 按字段先换成2个字符的数字和单位的中文表达,
三是 按2个字符截取字段, 将含零的字段消去单位,
四是 处理多余的零,然后拼接整数和小数,输出大写。
转换的算法就一个函数:
Function convert (){ //传入 snum $ 输出金额大写 put$
// M$="零元拾佰仟万拾佰仟亿拾佰仟兆拾佰仟京拾佰仟" ;
M$="零元拾佰仟万拾佰仟亿拾佰仟万拾佰仟万拾佰仟" ;
string pn$[50] ;
string dn[8] ; //中国式以每万为段,4位一段
//对输入字串截取整数部分和小数部分,
//小数部分直接转换,整数部分按万级分段,
//先处理整数的前几位,后处理后续的4位万级数,
//最后拼接字串输出金额大写
//snum="10020005600205" ; //test
g$= subString (snum, 0 ,1 ) ;
//输入 "0.56" format > " .56"
if(g$=="0") snum= subString (snum,1, 3) ;
nlen=len(snum) ;
n=nlen ;
for (i=0; i<nlen ; i++){
g$= subString (snum, i,1 ) ;
if(g$==".") n= i ; }
if (nlen-n>2) sn$=subString (snum,n+1,2) ;
if (nlen-n==2) sn$=subString (snum,n+1,1)+"0" ;
if (nlen-n==0) sn$="00" ; //无小数
fn$=subString (snum,0,n) ; //截取整数部分
print "输入金额 snum = ", snum ;
// print "整数部分 fn = ", fn$ ; //test
// print "小数角分 sn = ", sn$ ;
//开始转换,先处理整数 fn$ ******
chb$="" ; chs$="" ; chsd$="" ;
//角分小数部分 ******
d1$=subString(sn$,0,1) ;
d2$=subString(sn$,1,1) ;
// print d1$ +" "+d2$ ; //test
if (d1$=="0" ){
c$="零" ; }else{
a$=d1$ ;
snToD ();
c$=c$+"角" ; }
d$ =c$ ;
if (d2$=="0" ){
c$="整" ; }else{
a$=d2$ ;
snToD ();
c$=c$+"分" ; }
d$ =d$+c$ ;
chs$=d$ ; //小数chs$已转换
// print "chs$ = "+chs$ ; //test
if (d1$=="0"&&d2$=="0" ){ chs$="整" ; }
//开始转换,处理整数 fn$ ******
//4位段整数转换
nlen=len (fn$) ; //字串长度
n=nlen/4 ; //整数后4字数段位数
k=nlen-nlen/4*4 ; //mod 整数前几位
// print "Input fn$ = " + fn$ ; //test
// print "长串前面几位 k = " , k ;
// print "长串后 4 字段 n = " , n ;
d1$=subString (fn$, 0, k) ;
d2$=subString (fn$, k, nlen) ;
// print "d1$ = " + d1$ ; //test
// print "d2$ = " + d2$ ;
//整数前几位转换
for (i=0; i<k ; i++){ //
a$= subString (d1$, i, 1 ) ;
snToD () ; //数字转大写 得c$
b$=subString (M$, k - i+n*4,1) ;
p$=subString (N$, n*4+i, 1) ;
chsd$=chsd$+c$+b$ ; } //整数前几位
// print "chsd$ = " + chsd$ ; //test
//**** 整数前几位完成 chsd$
p$="" ;
for (i=0; i<n ; i++){ //整数后4数段位截串
dn[i]= subString (d2$, i*4 , 4 ) ;
p$=p$+ dn[i] +"" ; }
// print "p$ = "+p$ ; //test
int du ; // 4 位数段
for (du=0; du<n ; du++){ //按整数4数段位转换
p$="" ;
for (i=0; i<4 ; i++){ //
a$= subString (dn[du], i, 1 ) ;
snToD () ; //数字转大写 得c$
b$=subString (M$, n*4-du*4 - i ,1) ; //单位
p$=p$+c$+b$ ;
pn$[i]=c$+b$ ; } //整数后4字数段
chb$=chb$+p$ ; } //du
chb$=chsd$+chb$ ;
// print "chb$ = "+chb$ ; //含零整数完成test
//***************
p$=" " ;
nlen=len (chb$)/2 ; //按中文二字组字串
// for (i=0; i<30 ; i++){ pn$[i]=" " ; }
for (i=0; i<nlen ; i++){
pn$[i]=subString(chb$, i*2, 2) ; }
//按位数转换成大写 format 消单位 **********
p1$="" ; p2$="" ;
p$="" ;
for (k=0; k<nlen ; k++){
p1$=pn$[k] ;
if (p1$=="零仟") { pn$[k]="零" ; }
if (p1$=="零佰") { pn$[k]="零" ; }
if (p1$=="零拾") { pn$[k]="零" ; }
if (p1$=="零元") { pn$[k]="元" ; }
if (p1$=="零万") { pn$[k]="万" ; }
if (p1$=="零亿") { pn$[k]="亿" ; }
} //format
p$="" ;
for (m=0; m<nlen ; m++){ //重组整数部分>去零
p$=p$+pn$[m] ; }
// print p$ ; //test
nlen= len (p$) ;
for (i=0; i<nlen ; i++){ //renew p$
pn$[i]=subString(p$, i, 1) ; }
for (m=0; m<nlen ; m++){ //去多余 ”零”
p1$=pn$[m] ;
if (p1$=="零"&&pn$[m+1]=="零" ) { pn$[m]="" ; }
if (p1$=="零"&&pn$[m+1]=="元" ) { pn$[m]="" ; }
if (p1$=="零"&&pn$[m+1]=="万" ) { pn$[m]="" ; }
if (p1$=="零"&&pn$[m+1]=="亿" ) { pn$[m]="" ; }
if (p1$=="零"&&pn$[m+1]=="兆" ) { pn$[m]="" ; }
}
// print p1$ ; //test
chb$=" " ;
for (i=0; i<nlen ; i++){ //去零后重组整数部分
chb$=chb$+pn$[i] ; }
//特殊情况100000902 大写: 壹亿万零玖佰零贰元整
//测试时碰到此例 ”壹亿万零... ” 要消 "万" ****
//用京兆需要下列代码,用万亿、万万亿不需要
nlen= len (chb$) ;
for (i=0; i<nlen ; i++){ //特殊情况,消”万” ”亿”
a$=subString (chb$, i, 1 ) ;
b$=subString (chb$, i+1, 1 ) ;
if (a$=="亿"&&b$=="万") {
a$=subString (chb$, 1, i) ;
b$=subString (chb$, i+2, nlen-i ) ;
chb$= a$+b$ ; }
if (a$=="兆"&&b$=="亿") {
a$=subString (chb$, 1, i) ;
b$=subString (chb$, i+2, nlen-i ) ;
chb$=chb$+a$+b$ ; } }
nlen= len (chb$) ;
for (i=0; i<nlen ; i++){ //特殊情况,消”万”
a$=subString (chb$, i, 1 ) ;
b$=subString (chb$, i+1, 1 ) ;
if (a$=="兆"&&b$=="万") {
a$=subString (chb$, 1, i) ;
b$=subString (chb$, i+2, nlen-i ) ;
chb$=chb$+a$+b$ ; } }
chb$=chb$+chs$ ; //整数小数拼接,完成转换
if (snum=="."||snum==".0"||snum==".00"||snum=="0."||snum==" ") {
chb$= " 零元整" ; }
//输出结果 ******
print " 大写输出:" ;
put$=chb$ ;
print put$ ; //转换完成输出
print "...................................." ;
}//convert ()
//以下是完整的设计测试源码:
// **** 财务金额大写显示 **************
// 本代码是用简单的 C 语言写的,用 MySpringC
// v2.7 编译调试通过。可以 VB6, C++, Java 改写。
// 编译人:张纯叔(micelu@126.com )
//*******************************************
string sBarDes[10];
int nBarId[10];
string snum, put$ ; //传入金额,输出大写
int n, i, j, k, m ;
string N$ , M$, D$ ; //预设置大写字符
string a$, c$; //转换 传入a$ 输出c$
string d$, d1$, d2$ ; //计算小数角分
string fn$, sn$ ; //整数字串,小数字串
string chs$, chb$, chsd$ ; //小写,大写,整数首段
int nlen ; //Len 字数
string b$, g$, p$, p1$, p2$ ; //计算
main(){
setDisplay (0);
sBarDes[0]="输入金额";
nBarId[0]=100;
sBarDes[1]=" 测 试 ";
nBarId[1]=101;
sBarDes[2]=" 示 例 ";
nBarId[2]=102;
sBarDes[3]=" ";
nBarId[3]=103;
sBarDes[4]="退出程序 ";
nBarId[4]=104;
setToolBarHeight(10);
setButtonTextSize(15);
setToolBarBackgroundColor(255,220,220,220);
setButtonColor(255,240,240,240);
setButtonTextColor(255,0,0,200);
setToolBar(100,myToolBarProc,sBarDes,nBarId,6);
setTitle("金额大写转换");
while (){}
}//main ()
convert (){ //传入 snum $ 输出金额大写 put$
// M$="零元拾佰仟万拾佰仟亿拾佰仟兆拾佰仟京拾佰仟" ;
M$="零元拾佰仟万拾佰仟亿拾佰仟万拾佰仟万拾佰仟" ;
string pn$[50] ;
string dn[8] ; //中国式以每万为段,4位一段
//对输入字串截取整数部分和小数部分,
//小数部分直接转换,整数部分按万级分段,
//先处理整数的前几位,后处理后续的4位万级数,
//最后拼接字串输出金额大写
//snum="10020005600205" ; //test
g$= subString (snum, 0 ,1 ) ;
//输入 "0.56" format > " .56"
if(g$=="0") snum= subString (snum,1, 3) ;
nlen=len(snum) ;
n=nlen ;
for (i=0; i<nlen ; i++){
g$= subString (snum, i,1 ) ;
if(g$==".") n= i ; }
if (nlen-n>2) sn$=subString (snum,n+1,2) ;
if (nlen-n==2) sn$=subString (snum,n+1,1)+"0" ;
if (nlen-n==0) sn$="00" ; //无小数
fn$=subString (snum,0,n) ; //截取整数部分
print "输入金额 snum = ", snum ;
// print "整数部分 fn = ", fn$ ; //test
// print "小数角分 sn = ", sn$ ;
//开始转换,先处理整数 fn$ ******
chb$="" ; chs$="" ; chsd$="" ;
//角分小数部分 ******
d1$=subString(sn$,0,1) ;
d2$=subString(sn$,1,1) ;
// print d1$ +" "+d2$ ; //test
if (d1$=="0" ){
c$="零" ; }else{
a$=d1$ ;
snToD ();
c$=c$+"角" ; }
d$ =c$ ;
if (d2$=="0" ){
c$="整" ; }else{
a$=d2$ ;
snToD ();
c$=c$+"分" ; }
d$ =d$+c$ ;
chs$=d$ ; //小数chs$已转换
// print "chs$ = "+chs$ ; //test
if (d1$=="0"&&d2$=="0" ){ chs$="整" ; }
//开始转换,处理整数 fn$ ******
//4位段整数转换
nlen=len (fn$) ; //字串长度
n=nlen/4 ; //整数后4字数段位数
k=nlen-nlen/4*4 ; //mod 整数前几位
// print "Input fn$ = " + fn$ ; //test
// print "长串前面几位 k = " , k ;
// print "长串后 4 字段 n = " , n ;
d1$=subString (fn$, 0, k) ;
d2$=subString (fn$, k, nlen) ;
// print "d1$ = " + d1$ ; //test
// print "d2$ = " + d2$ ;
//整数前几位转换
for (i=0; i<k ; i++){ //
a$= subString (d1$, i, 1 ) ;
snToD () ; //数字转大写 得c$
b$=subString (M$, k - i+n*4,1) ;
p$=subString (N$, n*4+i, 1) ;
chsd$=chsd$+c$+b$ ; } //整数前几位
// print "chsd$ = " + chsd$ ; //test
//**** 整数前几位完成 chsd$
p$="" ;
for (i=0; i<n ; i++){ //整数后4数段位截串
dn[i]= subString (d2$, i*4 , 4 ) ;
p$=p$+ dn[i] +"" ; }
// print "p$ = "+p$ ; //test
int du ; // 4 位数段
for (du=0; du<n ; du++){ //按整数4数段位转换
p$="" ;
for (i=0; i<4 ; i++){ //
a$= subString (dn[du], i, 1 ) ;
snToD () ; //数字转大写 得c$
b$=subString (M$, n*4-du*4 - i ,1) ; //单位
p$=p$+c$+b$ ;
pn$[i]=c$+b$ ; } //整数后4字数段
chb$=chb$+p$ ; } //du
chb$=chsd$+chb$ ;
// print "chb$ = "+chb$ ; //含零整数完成test
//***************
p$=" " ;
nlen=len (chb$)/2 ; //按中文二字组字串
// for (i=0; i<30 ; i++){ pn$[i]=" " ; }
for (i=0; i<nlen ; i++){
pn$[i]=subString(chb$, i*2, 2) ; }
//按位数转换成大写 format 消单位 **********
p1$="" ; p2$="" ;
p$="" ;
for (k=0; k<nlen ; k++){
p1$=pn$[k] ;
if (p1$=="零仟") { pn$[k]="零" ; }
if (p1$=="零佰") { pn$[k]="零" ; }
if (p1$=="零拾") { pn$[k]="零" ; }
if (p1$=="零元") { pn$[k]="元" ; }
if (p1$=="零万") { pn$[k]="万" ; }
if (p1$=="零亿") { pn$[k]="亿" ; }
} //format
p$="" ;
for (m=0; m<nlen ; m++){ //重组整数部分>去零
p$=p$+pn$[m] ; }
// print p$ ; //test
nlen= len (p$) ;
for (i=0; i<nlen ; i++){ //renew p$
pn$[i]=subString(p$, i, 1) ; }
for (m=0; m<nlen ; m++){ //去多余 ”零”
p1$=pn$[m] ;
if (p1$=="零"&&pn$[m+1]=="零" ) { pn$[m]="" ; }
if (p1$=="零"&&pn$[m+1]=="元" ) { pn$[m]="" ; }
if (p1$=="零"&&pn$[m+1]=="万" ) { pn$[m]="" ; }
if (p1$=="零"&&pn$[m+1]=="亿" ) { pn$[m]="" ; }
if (p1$=="零"&&pn$[m+1]=="兆" ) { pn$[m]="" ; }
}
// print p1$ ; //test
chb$=" " ;
for (i=0; i<nlen ; i++){ //去零后重组整数部分
chb$=chb$+pn$[i] ; }
//特殊情况100000902 大写: 壹亿万零玖佰零贰元整
//测试时碰到此例 ”壹亿万零... ” 要消 "万" ****
//用京兆需要下列代码,用万亿、万万亿不需要
nlen= len (chb$) ;
for (i=0; i<nlen ; i++){ //特殊情况,消”万” ”亿”
a$=subString (chb$, i, 1 ) ;
b$=subString (chb$, i+1, 1 ) ;
if (a$=="亿"&&b$=="万") {
a$=subString (chb$, 1, i) ;
b$=subString (chb$, i+2, nlen-i ) ;
chb$= a$+b$ ; }
if (a$=="兆"&&b$=="亿") {
a$=subString (chb$, 1, i) ;
b$=subString (chb$, i+2, nlen-i ) ;
chb$=chb$+a$+b$ ; } }
nlen= len (chb$) ;
for (i=0; i<nlen ; i++){ //特殊情况,消”万”
a$=subString (chb$, i, 1 ) ;
b$=subString (chb$, i+1, 1 ) ;
if (a$=="兆"&&b$=="万") {
a$=subString (chb$, 1, i) ;
b$=subString (chb$, i+2, nlen-i ) ;
chb$=chb$+a$+b$ ; } }
chb$=chb$+chs$ ; //整数小数拼接,完成转换
if (snum=="."||snum==".0"||snum==".00"||snum=="0."||snum==" ") {
chb$= " 零元整" ; }
//输出结果 ******
print " 大写输出:" ;
put$=chb$ ;
print put$ ; //转换完成输出
print "...................................." ;
}//convert ()
test (){ //数值含零空位算法测试
clearOutput ();
print "特殊数值检测检验:" ;
snum="20000100300000000" ;
convert () ;
snum="100000902" ;
convert () ;
snum="20005600205" ;
convert () ;
snum="3060002065" ;
convert () ;
snum="10508005.75" ;
convert () ;
snum="50700650.5" ;
convert () ;
snum="1802065.06" ;
convert () ;
}//test ()
sample (){
clearOutput ();
print "输出示例:" ;
snum="30600702" ;
convert () ;
snum="1500903.08" ;
convert () ;
snum="1020697.00" ;
convert () ;
snum="159533.65" ;
convert () ;
snum="282581697.50" ;
convert () ;
snum="520967.56248" ;
convert () ;
snum="2801697.00" ;
convert () ;
}//sample()
snToD (){ //传入a$ 返回c$
N$="零壹贰叁肆伍陆柒捌玖" ;
if (a$=="0") c$=subString (N$,0,1) ;
if (a$=="1") c$=subString (N$,1,1) ;
if (a$=="2") c$=subString (N$,2,1) ;
if (a$=="3") c$=subString (N$,3,1) ;
if (a$=="4") c$=subString (N$,4,1) ;
if (a$=="5") c$=subString (N$,5,1) ;
if (a$=="6") c$=subString (N$,6,1) ;
if (a$=="7") c$=subString (N$,7,1) ;
if (a$=="8") c$=subString (N$,8,1) ;
if (a$=="9") c$=subString (N$,9,1) ;
}//snToD ()
input (){//输入
string m;
snum=stringInput (" 输入金额转大写 "," 输入金额小写 例: 3572689.36 \n ( 输出金额大写 )\n 输入 [ 空 ] 退出 " ) ;
clearOutput ();
print "Input 金额 = ",snum ;
if (snum=="") { snum=".00" ;
print "输入为空,请重新输入。 " ; }
convert () ;
}//input ()
myToolBarProc(int nBtn,int nContext) {
if(nBtn==100){//输入金额
input (); }
if(nBtn==101){ //test 测试
test () ; }
if(nBtn==102){//示例
sample (); }
if(nBtn==103){//算法测试
// convert () ;
}
if(nBtn==104){//退出程序
clearOutput();
exit (0); }
}//myToolbar ()
//**** End ****
大数值金额大写转换(C语言)相关推荐
- js大数值单位转换千、万、亿单位,复制即可用
最近呢在爬微博热门但是爬出来的热度是显示全部数字,显得特别难看 于是我就做了一个小的封装整体代码如下 /*** 数字格式化*/ module.exports = {/*** 数字格式化:万.亿单位* ...
- java中大数值_Java大数值转换
在java语言中,包括了很多种java数据类型,相信大家对这些基础知识并不陌生,但是有时候这些数据类型的精度不能满足要求时,就需要用更大或者精度更高的类型,这时候就需要使用到大数值.那么大数值是什么? ...
- [收藏|转贴]货币金额大写转换库(C#)
货币金额大写转换库 http://www.vckbase.com/bbs/prime/viewprime.asp?id=576 // 货币金额大写转换库 Money2String.dll // 静 ...
- matlab 数值格式转换,Matlab字符串转换及数值格式转换
Matlab字符串转换及数值格式转换 字符串转换函数 abs 字符串到ASCII转换 dec2hex 十进制数到十六进制字符串转换 fprintf 把格式化的文本写到文件中或显示屏上 hex2dec ...
- C语言中的标识符以字母或下划线开头,牛逼大神整理的C语言基础知识,你确定你不码下来?...
[[怪兽爱C语言]牛逼大神整理的C语言基础知识,你确定你不码下来?]https://toutiao.com/group/6577344220355363341/?iid=15906422033& ...
- Java版 数字金额大写转换
需求:读入一个浮点数值,将其转化为中文金额的大写形式.如123.45,转化为:壹佰贰拾叁元肆角伍分. 以下是各种情况要完善: 1. 当金额为整数,只表示整数部分,省略小数部分,并添加"整&q ...
- Python数值特征转换
前言 经常用SparkML中特征转换,包括二值化.多项式展开.字符串-索引变换.独热编码.规范化.最大-最小缩放.分位数离散化等等一系列的操作,可如何用python来实现呢? 全面了解请看官网 离散值 ...
- 软件开发基于JavaScript实现快速转换文本语言(繁体中文和简体中文)_javascript技巧
软件开发基于JavaScript实现快速转换文本语言(繁体中文和简体中文)_javascript技巧 一般商业网站都有一个语言的需求,就是为了照顾使用正体中文的国人,会特地提供一个切换到正体中文的选项 ...
- C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...
最新文章
- OpenCV(项目)二维码识别(二维码、条形码)
- UVA, 580 Critical Mass
- Python自动化运维技术与最佳实现
- Jenkins+Jmeter持续集成笔记(四:定时任务和邮件通知)
- 从Exchange 通往Office 365系列(十六)添加域名到Office 365
- PHP学习记录第一篇:Ubuntu14.04下LAMP环境的搭建
- Android中Context详解
- php accesscontrolalloworigin,设置Access-Control-Allow-Origin实现跨域访问
- java 8的内存分代改进_java8的内存结构,这一篇文章就够了
- [C#]Main(String[] args)参数输入问题
- SqlServer Convert函数 日期格式化
- 15张图带你彻底明白spring循环依赖,再也不用怕了
- Unity 一种更为简洁明了的环绕相机方案
- Spring中init-method和destroy-method的四种方式
- OSChina 周六乱弹 —— 啊,谢谢好心的先生
- 线性代数matlab求一个正交矩阵,线性代数求一个正交矩阵P,是P^-1AP= – 手机爱问...
- 如何做出一个微信小程序
- Adobe Lightroom Classic 入门教程(七)修改照片 --- 暗角颗粒与相机配置校正
- 网络加载框架 - Retrofit
- k8s集群部署nginx服务并使用ceph-csi挂载存储以及测试
热门文章
- 恢复rm -rf 的数据
- 文本标注开源系统Doccano、Label Studio、BRAT比较
- EC20 centos7 调试_CentOS 7实现离线下载
- 【硬件工程师炼成之路】器件篇 铝电解电容 电感 磁珠
- HTML常见问题整理1
- python爬取微信小程序源代码_【实战】CrawlSpider实现微信小程序社区爬虫
- centos7安装activemq以及无法访问前台页面
- 笔者带你剖析三种常见的分布式路由算法
- html页面表格字体,如何在移动设备html页面的表格单元格中设置相同的字体大小...
- 51nod 1740蜂巢迷宫