金额大写转换

news2024/11/18 20:30:27

金额大写转换(C语言 )
本人喜欢探索各种算法。见站内好多此类文章,有些很好,有些不完整。姑且也来凑下热闹。
金额大写应用在很多方面,如支票、发票、各种单据,各种财务凭证,合同文本金额部分。财务方面制定了一套标准的表达法。财务上金额大写是没有负数的,财务上分借方和贷方,负数就是借方红字和贷方红字,也就是赤字。大写转换的算法要按财务管理的标准来设置。本文详细介绍算法的要点。

13a336f86e314b7c8b13d0a871f88ee4.png
算法的要点:
简单地讲就是字串转换处理。若输入是数值型则转为字串型。
将输入的金额分成整数部分和小数部分,按金额数值逐位转换成中文,拼成大写字串,然后输出。
对于不含零的情况,直接就转换好了。然而对于含零和连续多个零的情况就要消除多余的零。本文介绍的算法就是 ”截数值位消零法”,或称 ”截位消零法” 。
要处理的是整数部分,分三步:
一是  先换成2个字符的数字和单位中文表达,
二是  按2个字符截取字段, 将含零的字段消去单位,
三是  处理多余的零。

 18be649c0750416688b1a3791b9fee91.png

 

转换的算法就一个函数:
 Function   exchange (  ) {   //传入 snum  输出金额大写
 M$="零元拾佰仟万拾佰仟亿拾佰仟万拾佰仟" ;
//对输入字串截取整数部分 fn$ 和小数部分 sn$
        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$ ******
        nlen=len (fn$) ;    //字串长度
   chb$=" " ;  chs$=" " ;
   for (i=0; i<nlen ; i++){
        a$= subString (fn$, i,1 ) ;
        snToD () ;      //数字转大写 得c$
        b$=subString (M$,nlen-i,1) ;
        chb$=chb$+c$+b$ ;    //整数已转换
            }

     if (sn$=="00") {  //小数部分角分为零
            chb$=chb$+"整" ;
            goto result ;        }   //无小数转输出

//角分小数部分 ******
      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$已转换

//输出结果 ******
//上述计算已得到整数和小数部分的字串chb$ , chs$
//对于含零的位数需进一步处理。下面的算法可称为
// ”截数值位消零法”,或称 ”截位消零法” 。
result :
string pn$[20] ;
      p$=" " ;
      nlen=len (chb$)/2 ;   //按中文二字组字串
   for (i=0; i<20 ; i++){  pn$[i]=" " ;  }
   for (i=0; i<nlen ; i++){
          pn$[i]=subString(chb$, i*2+1, 2) ;   }
   for (i=0; i<nlen ; i++){
          p$=p$+pn$[i]+" "  ;        }
          //  print p$ ;      //测试
//按位数处理” 零”   format **********
    for (i=0; i<nlen ; i++){
           p$=pn$[i] ;
        if (p$=="零仟") { pn$[i]="零" ;    }
        if (p$=="零佰") { pn$[i]="零" ;    }
        if (p$=="零拾") { pn$[i]="零" ;    }
        if (p$=="零元") { pn$[i]="元" ;    }
        if (p$=="零万") { pn$[i]="万" ;    }
        if (p$=="零亿") { pn$[i]="亿" ;    }
                 }  //format

  //处理连续位数零的整数部分 ******
     chb$=" " ;
     for (i=0; i<nlen ; i++){    //重组整数部分>去零
         chb$=chb$+pn$[i] ;      } 
         // print  chb$+chs$ ;    //测试
     p$=" " ;
     nlen=len (chb$) ;
   for (i=0; i<20 ; i++){  pn$[i]=" " ;      }
   for (i=0; i<nlen ; i++){
          pn$[i]=subString(chb$, i, 1) ;    }
   for (i=0; i<nlen ; i++){   //去多余 ”零”
          p$=pn$[i] ;
       if (p$=="零"&&pn$[i+1]=="零" ) {  pn$[i]="" ;  }       
       if (p$=="零"&&pn$[i+1]=="元" ) {  pn$[i]="" ;  }       
       if (p$=="零"&&pn$[i+1]=="万" ) {  pn$[i]="" ;  }       
       if (p$=="零"&&pn$[i+1]=="亿" ) {  pn$[i]="" ;  }       
              }

    chb$=" " ;
    for (i=0; i<nlen ; i++){   //去零后重组整数部分
            chb$=chb$+pn$[i] ;      } 
//特殊情况100000902  大写: 壹亿万零玖佰零贰元整
//测试时碰到此例 ”壹亿万零... ”  要消 "万" ****
//string p1$, p2$ ;
         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$ ;   }   }
//输出结果 ****** 
   // print " " ;
    print "  大写输出:" ;
    print  chb$+chs$ ;      
    print "……………………………………...>" ;
}//exchange ()

f644f03877794d88916488989560d006.png

 
//以下是示例源码:
// ****  财务金额大写显示  **************
// 本代码是用简单的 C 语言写的,用 MySpringC
//  v2.7 编译调试通过。可以 VB6, C++, Java 改写。
// 编译人:张纯叔(micelu@126.com )
//*******************************************
string sBarDes[10];
int nBarId[10];
string snum  ;    //输入金额
int n, i, j ;
 string N$ , M$ ;   //预设置大写字符
 string a$, c$;     //转换 传入a$ 输出c$
 string d$, d1$, d2$ ;    //计算小数角分
 string fn$, sn$ ;    //整数字串,小数字串
 string chs$, chb$ ; //小写,大写
int nlen ;             //字数
string b$, g$, p$ ;    //计算

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 ()


exchange (){   //开始转换
 M$="零元拾佰仟万拾佰仟亿拾佰仟万拾佰仟" ;
//对输入字串截取整数部分和小数部分
        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$ ******
        nlen=len (fn$) ;    //字串长度
   chb$=" " ;  chs$=" " ;
   for (i=0; i<nlen ; i++){
        a$= subString (fn$, i,1 ) ;
        snToD () ;      //数字转大写 得c$
        b$=subString (M$,nlen-i,1) ;
        chb$=chb$+c$+b$ ;    //整数已转换
            }

     if (sn$=="00") {  //小数部分角分为零
            chb$=chb$+"整" ;
            goto result ;        }   //无小数转输出

//角分小数部分 ******
      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$已转换

//输出结果 ******
//上述计算已得到整数和小数部分的字串chb$ , chs$
//对于含零的位数需进一步处理。下面的算法可称为
// ”截数值位消零法”,或称 ”截位消零法” 。
result :
string pn$[20] ;
      p$=" " ;
      nlen=len (chb$)/2 ;   //按中文二字组字串
   for (i=0; i<20 ; i++){  pn$[i]=" " ;  }
   for (i=0; i<nlen ; i++){
          pn$[i]=subString(chb$, i*2+1, 2) ;   }
   for (i=0; i<nlen ; i++){
          p$=p$+pn$[i]+" "  ;        }
          //  print p$ ;      //测试
//按位数处理  ”零”   format **********
    for (i=0; i<nlen ; i++){
           p$=pn$[i] ;
        if (p$=="零仟") { pn$[i]="零" ;    }
        if (p$=="零佰") { pn$[i]="零" ;    }
        if (p$=="零拾") { pn$[i]="零" ;    }
        if (p$=="零元") { pn$[i]="元" ;    }
        if (p$=="零万") { pn$[i]="万" ;    }
        if (p$=="零亿") { pn$[i]="亿" ;    }
                 }  //format

  //处理连续位数零的整数部分 ******
     chb$=" " ;
     for (i=0; i<nlen ; i++){    //重组整数部分>去零
         chb$=chb$+pn$[i] ;      } 
         // print  chb$+chs$ ;    //测试
     p$=" " ;
     nlen=len (chb$) ;
   for (i=0; i<20 ; i++){  pn$[i]=" " ;      }
   for (i=0; i<nlen ; i++){
          pn$[i]=subString(chb$, i, 1) ;    }
   for (i=0; i<nlen ; i++){   //去多余 ”零”
          p$=pn$[i] ;
       if (p$=="零"&&pn$[i+1]=="零" ) {  pn$[i]="" ;  }       
       if (p$=="零"&&pn$[i+1]=="元" ) {  pn$[i]="" ;  }       
       if (p$=="零"&&pn$[i+1]=="万" ) {  pn$[i]="" ;  }       
       if (p$=="零"&&pn$[i+1]=="亿" ) {  pn$[i]="" ;  }       
              }

    chb$=" " ;
    for (i=0; i<nlen ; i++){   //去零后重组整数部分
            chb$=chb$+pn$[i] ;      } 
//特殊情况100000902  大写: 壹亿万零玖佰零贰元整
//测试时碰到此例 ”壹亿万零... ”  要消 "万" ****
//string p1$, p2$ ;
         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$ ;   }   }
//输出结果 ****** 
   // print " " ;
    print "  大写输出:" ;
    print  chb$+chs$ ;      
    print "……………………………………...>" ;
}//exchange ()

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 ()

sample (){
  clearOutput ();
  print "输出示例:" ;
  snum="30600702" ;
       exchange () ;
  snum="1500903.08" ;
       exchange () ;
  snum="1020697.00" ;
      exchange () ;
  snum="159533.08" ;
      exchange () ;
   snum="282581697.50" ;
      exchange () ;
  snum="520967.56248" ;
       exchange () ;
  snum="2801697.00" ;
      exchange () ;
}//sample() 

f6a1771c13034d97a236785a1fb068de.png
test (){  //数值含零空位算法测试
       clearOutput ();
  print "特殊数值检测检验:" ;
  snum="100000902" ;
       exchange () ;
  snum="20005600205" ;
       exchange () ;
  snum="3060002065" ;
       exchange () ;
  snum="10508005.75" ;
       exchange () ;
  snum="50700650.5" ;
       exchange () ;
  snum="1802065.06" ;
       exchange () ;
  snum="10502065.36" ;
       exchange () ;
}//test ()

 134e0153061d4fa39816f0c5f29d565b.png 

input (){//输入
string m;
    snum=stringInput (" 输入金额转大写 ","   输入金额小写   例: 3572689.36  \n        ( 输出金额大写  )\n    输入 [ 空 ]  退出 " ) ;
          clearOutput ();
  g$= subString (snum, 0 ,1 ) ; 
  //输入 "0.56"  format >  " .56" 
    if(g$=="0") snum= subString (snum,1, 3)  ; 

     print "Input  金额 = ",snum ;
     exchange ();   
}//input ()

myToolBarProc(int nBtn,int nContext)
{
      if(nBtn==100){//输入金额
          input ();
             }
      if(nBtn==101){  //test 测试
          test () ;
             }
       if(nBtn==102){//示例
            sample ();
             }
      if(nBtn==103){//
          //xxx xxx ();
              }
      if(nBtn==104){//退出程序
          clearOutput();
          exit (0);
         }
}//myToolbar ()

 

//**** End ****

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【逐步剖C】-第七章-数据的存储

一、数据类型介绍 1. C语言基本内置类型&#xff1a; char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点数 double //双精度浮点数2. 类型的基本归类 &#xff08;1&#xff09;整型&#xff1a; charunsign…

c语言指针

指针 指针是存放地址的变量&#xff0c;也可以说指针地址。 对于定义p&#xff08;这里的话&#xff0c;只是定义&#xff0c;说明p是指针&#xff09;&#xff0c;p作为一个指针去指向存放数据的位置&#xff0c;而p意思是取&#xff08;p指向的内存位置的数据&#xff09;&…

es启动,浏览器无法访问9200

通过brew成功启动es&#xff0c;但是访问http://localhost:9200/报错&#xff0c;连接被拒绝 %:brew services start elasticsearch-full> Successfully started elasticsearch-full (label: homebrew.mxcl.elasticsearc可能原因如下&#xff1a; 1、安装java 要先安装ja…

聊聊async/await原理

前言 我们知道Promise的出现极大地解决了回调地狱&#xff0c;但是如果使用流程非常复杂的话&#xff0c;就非常容易过多地调用Promise的then()方法&#xff0c;这样也不利于使用和阅读。 例如&#xff1a;我希望在请求 www.baidu.com 后输出请求的结果&#xff0c;再去请求 …

【基于腾讯云的远程机械臂小车】

1. 项目来源 项目源码地址&#xff1a;https://gitcode.net/VOR234/robot_arm_car/-/blob/master/TencentOS-tiny123.zip https://gitee.com/vor2345/robot_arm_car 程序分别 视频演示&#xff1a;https://www.bilibili.com/video/BV15M4y1D7MD/?vd_source530bf85167de80ff…

46.在ROS中实现global planner(2)

前文实现了一个global planner的模板&#xff0c;并且可以工作&#xff0c;本文将实现astar算法&#xff0c;为后续完成一个astar global planner做准备 1. AStar简介 1.1 AStar Astar算法是一种图形搜索算法,常用于寻路。Astar算法原理网上可以找到很多&#xff0c;简单的说…

企业/品牌新闻稿怎么写?

撰写出优质的企业/品牌新闻稿对于任何一个希望通过新闻媒体推广自己品牌的公司来说都是十分重要的。在新闻稿中&#xff0c;您可以通过介绍自己的公司&#xff0c;披露最新的产品和服务信息以及宣传最新的成就来吸引媒体和读者的关注。下面是一些关于如何撰写出优质的企业/品牌…

【工具篇】Firmwalker车联网实用小工具介绍

前言 firmwalker这个小工具在工作中也一直在用&#xff0c;正好领导说要写一篇这个工具的分析说明文章&#xff0c;经过询问可以发表博客。由于一直在用&#xff0c;所以末尾优劣势部分存在一些主观想法。 编写不易&#xff0c;如果能够帮助到你&#xff0c;希望能够点赞收藏加…

SpringCloud, SpringCloud-Alibaba,Nacos概述

目录 SpingCloud概述 1.SpringCloud是什么? 2.SpringCloud和SpringBoot的关系 3.SpringCloud-Alibaba概述 3.1.Netflix公司项目进入维护模式 3.2.Spring Cloud Alibaba是什么&#xff1f; 3.3.Spring Boot和Spring Cloud的版本号说明 3.Nacos总结 SpingCloud概述 1.Spri…

蓝桥杯刷题——基础篇(一)

这部分题目&#xff0c;主要面向有志参加ACM与蓝桥杯竞赛的同学而准备的&#xff0c;蓝桥杯与ACM考察内容甚至评测标准基本都一样&#xff0c;因此本训练计划提供完整的刷题顺序&#xff0c;循序渐进&#xff0c;提高代码量&#xff0c;巩固基础。因竞赛支持C语言、C、Java甚至…

【JAVA八股文】算法、数据结构、基础设计模式

算法、数据结构、基础设计模式1. 二分查找2. 冒泡排序3. 选择排序4. 插入排序5. 希尔排序6. 快速排序7. ArrayList8. Iterator9. LinkedList10. HashMap1&#xff09;基本数据结构2&#xff09;树化与退化3&#xff09;索引计算4&#xff09;put 与扩容5&#xff09;并发问题6&…

从lettcue插件看skywalking

lettcue 的写操作是异步的。io.lettuce.core.RedisChannelWriter.write进行写入&#xff0c;io.lettuce.core.protocol.RedisCommand进行异步读取数据 skywalking 插件大体逻辑 在方法执行前&#xff0c;通过ContextManager创建span创建span的同时&#xff0c;判断trace上下文…

零信任-Akamai零信任介绍(6)

​Akamai零信任介绍 Akamai是一家专注于分布式网络服务的公司&#xff0c;它提供了一系列的互联网内容和应用加速服务。关于Akamai的零信任&#xff0c;它指的是Akamai的安全架构中不存在任何一个环节是可以被单独的控制或影响的&#xff0c;因此可以提供更高的安全性。通过使…

ChatGPT is not all you need,一文看尽SOTA生成式AI模型:6大公司9大类别21个模型全回顾(三)

文章目录ChatGPT is not all you need&#xff0c;一文看尽SOTA生成式AI模型&#xff1a;6大公司9大类别21个模型全回顾&#xff08;三&#xff09;Text-to-Text 模型ChatGPTLaMDAPEERMeta AI Speech from BrainText-to-Code 模型CodexAlphacodeText-to-Science 模型GalacticaM…

超简单!pytorch入门教程:Tensor

超简单&#xff01;pytorch入门教程&#xff1a;Tensor 一、pytorch安装 安装pytorch之前&#xff0c;需要安装好python&#xff08;废话&#xff09;&#xff0c;还没安装过python的宝宝请先移步到廖雪峰的python教程&#xff0c;待安装熟悉完之后&#xff0c;再过来这边。 …

C代码中访问链接脚本中的符号

一、目的在之前的《GNU LD脚本命令语言&#xff08;一&#xff09;》、《GNU LD脚本命令语言&#xff08;二&#xff09;》我们介绍了GNU链接脚本的知识点&#xff0c;基本上对链接脚本中的SECTION、REGION、以及加载地址与执行地址的关系等内容有了一定的了解。本篇主要讲解链…

工业4.0是如何优化垃圾处理行业的

如今&#xff0c;工业4.0正在影响着制造业和物流等行业&#xff0c;其发展潜力在未来还有望进一步扩大。一些全球领先的垃圾处理公司已经开始在水处理和废物回收等领域应用工业4.0。工业4.0的创新给这个领域带来了一些必要的改进。随着环境危机的加剧&#xff0c;垃圾处理行业面…

2022年最新数据库调查报告:超八成DBA月薪过万,你拖后腿了吗?

数据库管理员属于IT行业高薪职业的一种&#xff0c;近几年关于数据库管理员的薪资统计文章也层出不穷&#xff0c;那么当前&#xff0c;DBA们的薪资究竟到达了怎样的水平呢&#xff1f;墨天轮数据社区发布最新《2022年墨天轮数据库大调查报告》&#xff0c;数据显示超八成DBA月…

《MySQL学习》 全局锁和表锁

一.MySQL锁的分类 二.全局锁 全局锁对整个数据库加锁&#xff0c;可以执行如下命令&#xff0c;整个数据库都将处于只读状态。 Flush tables with read lock ;我们可以执行 unlock table进行解锁 unlock table ;读操作 非读操作&#xff08;阻塞&#xff09; 全局锁的典型使…

【并发编程】【2】进程与线程

并发编程 2.进程与线程 2.1 进程与线程 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 CPU&#xff0c;数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管…