本程序实现英文数字到中文大写数字的转换。
主要思想是利用该语法自底向上地构造出1——>999999999999;
然后将数字转换成中文大写。
利用flex进行词法分析,bison进行句法分析。

语法如下:
e1-->one|two|three|four|five|six|seven|eight|nine
e2-->ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen
e3-->twenty|thirty|forty|fifty|sixty|seventy|eighty|ninety
 
e4-->e3-e1
    |e3
    |e2
    |e1
 
e51-->e1 hundred and e4
     |e1 hundred
e52-->e51
     |e4
 
e61-->e52 thousand e51
     |e52 thousand and e4
     |e52 thousand  
e62-->e61
     |e52
 
e71-->e52 million e61
     |e52 million e51
     |e52 million and e4
     |e52 million
e72-->e71
     |e62
 
e81-->e52 billion e71
     |e52 billion e61
     |e52 billion e51
     |e52 billion and e4
     |e52 billion
e82-->e81
     |e72
     |zero

lex.l文件如下:

%%
zero     {yylval=0;return ZERO;}
one      {yylval=1;return NUM1;}
two      {yylval=2;return NUM1;}
three    {yylval=3;return NUM1;}
four     {yylval=4;return NUM1;}
five     {yylval=5;return NUM1;}
six      {yylval=6;return NUM1;}
seven    {yylval=7;return NUM1;}
eight    {yylval=8;return NUM1;}
nine     {yylval=9;return NUM1;}
ten      {yylval=10;return NUM2;}
eleven   {yylval=11;return NUM2;}
twelve   {yylval=12;return NUM2;}
thirteen {yylval=13;return NUM2;}
fourteen {yylval=14;return NUM2;}
fifteen  {yylval=15;return NUM2;}
sixteen  {yylval=16;return NUM2;}
seventeen {yylval=17;return NUM2;}
eighteen {yylval=18;return NUM2;}
nineteen {yylval=19;return NUM2;}
twenty   {yylval=20;return NUM3;}
thirty   {yylval=30;return NUM3;}
forty    {yylval=40;return NUM3;}
fifty    {yylval=50;return NUM3;}
sixty    {yylval=60;return NUM3;}
seventy  {yylval=70;return NUM3;}
eighty   {yylval=80;return NUM3;}
ninety   {yylval=90;return NUM3;}
hundred  {return HUNDRED;}
thousand {return THOUSAND;}
million  {return MILLION;}
billion  {return BILLION;}
and      {return AND;}
[ \t]+   /* skip blanks */
.|\n     { return yytext[0];}

parser.y文件如下:

%{
#include<cmath>
#include <string>
#include <iostream>
using namespace std;
void yyerror(string msg);
string trans(int term);
void dtos(long term,string &result);
int yylex();
#define YYSTYPE long
%}
%token NUM1
%token NUM2
%token NUM3
%token ZERO
%token HUNDRED
%token THOUSAND
%token MILLION
%token BILLION
%token AND
%%
lines : lines e82 '\n' {string result;dtos($2,result);cout<<result<<endl;}| lines '\n'| /*empty*/|error '\n' {yyerrok;};e82:e81  {$$=$1;}|e72  {$$=$1;}|ZERO {$$=0;};
e81:e52 BILLION e71    {$$=$1*pow(10,9)+$3;}|e52 BILLION e61    {$$=$1*pow(10,9)+$3;}|e52 BILLION e51    {$$=$1*pow(10,9)+$3;}|e52 BILLION AND e4 {$$=$1*pow(10,9)+$4;}|e52 BILLION        {$$=$1*pow(10,9);};e72:e71 {$$=$1;}|e62 {$$=$1;};
e71:e52 MILLION e61    {$$=$1*pow(10,6)+$3;}|e52 MILLION e51    {$$=$1*pow(10,6)+$3;}|e52 MILLION AND e4 {$$=$1*pow(10,6)+$4;}|e52 MILLION        {$$=$1*pow(10,6);};e62:e61 {$$=$1;}|e52 {$$=$1;};
e61:e52 THOUSAND e51 {$$=$1*pow(10,3)+$3;}|e52 THOUSAND AND e4 {$$=$1*pow(10,3)+$4;}|e52 THOUSAND {$$=$1*pow(10,3);};e52:e51 {$$=$1;}|e4 {$$=$1;};
e51:e1 HUNDRED AND e4 {$$=$1*pow(10,2)+$4;}|e1 HUNDRED {$$=$1*pow(10,2);};e4:e3'-'e1{$$=$1+$3;}|e3 {$$=$1;}|e2 {$$=$1;}|e1 {$$=$1;};
e3:NUM3 {$$=$1;};
e2:NUM2 {$$=$1;};
e1:NUM1 {$$=$1;};
%%
#include "lex.yy.c"
int main()
{return yyparse();
}void yyerror(string msg) {cout<<msg<<endl;
}
string trans(int term)
{if(term==1)return "壹";if(term==2)return "贰";if(term==3)return "叁";if(term==4)return "肆";if(term==5)return "伍";if(term==6)return "陆";if(term==7)return "柒";if(term==8)return "捌";if(term==9)return "玖";
}
void dtos(long term,string &result)
{bool flag1=false,flag2=false,flag3=false,flag4=false;long temp1=term/100000000;if(temp1!=0){flag1=true;dtos(temp1,result);result+="亿";}term%=100000000;long temp2=term/10000;if(temp2!=0){if(temp2<1000){if(flag1)result+="零";}flag2=true;dtos(temp2,result);result+="万";} else if(flag1){ result+="零";}term%=10000;long temp3=term/1000;if(temp3!=0){flag3=true;result+=trans(temp3);result+="仟";}else if(flag2){result+="零";}term%=1000;long temp4=term/100;if(temp4!=0){flag4=true;result+=trans(temp4);result+="佰";} else if(flag3){result+="零";}term%=100;long temp5=term/10; if(temp5!=0){result+=trans(temp5);result+="拾";}else if(flag4){result+="零";}term%=10;long temp6=term;if(temp6!=0)result+=trans(temp6);if(result=="")result+="零";string temp=result.substr(result.length()-3,result.length());if((result!="零")&&(temp=="零")){result=result.substr(0,result.length()-3);}
}

程序的运行:
flex lex.l
bison parser.y
g++ parser.tab.c -ly -ll
./a.out
输入英文数字回车得到对应的中文大写。

编程实现英文数字到中文大写数字的转换相关推荐

  1. 数字与中文大写数字互转(5千万亿亿亿亿以上的数字也支持转换)

    来源是看到知乎上一个奇葩问题: 任意大小的数字字符串转中文 其实10万以内的整数转换大写也太简单,今天我们要实现的是任意大小的数字字符串转大写. 首先我们要保证4位数以内的转换函数,能够处理各种含&q ...

  2. java实现数字转中文大写数字

    import java.util.HashMap; public class dds { /** *  * 数字转中文 *  * @param list *  * @return */ private ...

  3. XtraReport报表入库单数字转中文大写数字

    先看看打印入库单的效果图,看如下: 客户要求合计一行,要求大写中文数字.XtraReport报表是如何做出以上图的效果呢?因为是要把数字转成大写中文数字,得先准备数字转大写中文数字的函数.因网上有很多 ...

  4. Python:阿拉伯数字转换为中文大写数字(金额的读数规则)

    萌萌帮班里同学做了一个python的编程作业,正好回顾一下python基础知识,以下源码和思考过程,代码全部原创. IDE:pycharm python版本:python3.7 ''' 实验目的:在银 ...

  5. Keras-10 【Seq2Seq示例】数字转中文大写

    Keras Seq2Seq示例 任务很简单,将数字转为中文大写金额,例如 11288 -> 壹万壹仟零捌拾捌元整 我们将尝试利用seq2seq来解决这一问题,整个示例包括以下部分: 建立数据集 ...

  6. 将数字0-9转为中文大写数字

    //转为中文大写数字 var n = 230 var fraction = ["角", "分"]; var digit = ["零", &q ...

  7. JAVA 纯数字/金额数字转中文大写

    有时候一些金额数字需要转成中文大写展示到发票的金额框这类地方,包括一些纯粹的数量非金额的数字的大写转换,网上看很多都是金额的,纯数字的话有些不同,这里写了一个数字转中文大写的工具类: 1:金额数字转中 ...

  8. 把阿拉伯数字翻译成中文大写数字

    package com.zcw.zcwbook.demo15;/*** @program: zcwbook* @description: 把阿拉伯数字翻译成中文大写数字* @author: zhaoc ...

  9. js如何实现阿拉伯数字转中文大写数字

    前言 最近有个需求,需要把阿拉伯数字转成中文大写数字,比如:100 转换成壹佰元.话不多说,撸起袖子就是干,做野! 规则 首先我们看看百度百科大写数字,对大写规则的描述: 中文大写数字到"元 ...

  10. 数字大写 php 代码,PHP 中文大写数字 转成 数字代码

    echo ""; echo test('一十二亿七十一万五十一'); /* create by piaofen date: 2011-03-31 function: 中文大写数字转 ...

最新文章

  1. php找不到phpmyadmin,nginx下找不到phpmyadmin文件
  2. 某阿里程序员求助:绩效背1,老板让他主动走!敢要n+1就在背调时说坏话!怎么办?网友:大不了鱼死网破!...
  3. Convolutional Neural Networks for Sentence Classification
  4. 轮廓线重建:二维平行轮廓线重建理论和方法
  5. 不要在意七十亿分之一对另七十亿分之一的看法
  6. 一般编译器错误_[翻译]MLIR:摩尔定律终结的编译器基础结构
  7. medit 和 .mesh 文件
  8. 力扣-414 第三大的数
  9. mysql百万数据生成
  10. shell 编写脚本批量ping ip
  11. CDN技术详解之引言
  12. android ios相机,曝苹果iOS13相机加入了这项功能 安卓上早就有了
  13. 2019年会总结+自我反思
  14. Windows开发入门:工具-WinDbg的安装和使用教程
  15. C语言实现线性回归求斜率
  16. 【预训练语言模型】WKLM: Pretrained Encyclopedia: Weakly Supervised Knowledge-Pretrained Language Model
  17. 【转载】Oracle 大字段处理
  18. 窄告:超越搜索引擎关键词模式的精准营销
  19. 国际篮球规则2017 FIBA 简述
  20. PHP读取文件排序:解决文件名排序10排在2前面的问题

热门文章

  1. 团!结就是力量!团!结就是力量!小鸟云拼团云主机【低至10元/月】
  2. python3 用socket编写ftp
  3. 如何看待“英特尔是一家软件公司”?
  4. Dzz1.3测试,增加IM、桌面协作、多选等。修缮问题后发布下载
  5. 【毕设记录日记】深度学习|铝型材表面缺陷视觉检测算法:YOLOv5环境搭建、基础知识、问题解决、优化方法
  6. 看什么书可以提高情商?提高情商的书籍排行榜
  7. 深度:老年消费品细分领域潜藏爆品机会,老花镜市场6000万风险投资揭示老年消费升级背后的创新机会!
  8. 推荐!十个好用的百度网盘搜索引擎
  9. ODI 12C 数据元表主资料库67个表 工作资料库153个表
  10. 程序员的奋斗史(七)——沟通交流、表达能力的重要性