小写金额转换为大写金额(C实现)
金额小写自动生成大写公式
金额小写自动生成大写公式金额小写转换成大写的公式主要依据中文的数字命名规则。
以下是一个可将金额小写转换成大写的公式:1.将金额小写以“元”为单位进行分组,每四位一组分组(从低位到高位),以方便命名。
2.对于每一组最高位的数字,根据其所在的组数命名单位(例如“元”、“万”、“亿”)。
其他位的数字分别根据其所在的位数加上相应的单位(例如“拾”、“佰”、“仟”、“拾万”、“佰万”、“仟万”、“拾亿”等)。
3.对于每一组中的数字,根据其大小进行命名。
命名规则如下:-0不进行命名,直接舍弃。
-1命名为“壹”或“一”(个别情况)。
-其他数字命名为“贰”、“叁”、“肆”、“伍”、“陆”、“柒”、“捌”、“玖”。
4.在每个数字后面添加相应的单位(例如“角”、“分”、“整”),其他位的单位根据需要进行命名,例如“拾角”、“佰角”、“仟分”等。
5.将每一组的命名和单位合并,组成完整的大写金额。
以下是一个具体的例子来说明公式的应用:假设要将金额小写1202.34转换成大写金额,根据公式:1.将金额小写以“元”为单位进行分组,得到两组数字:1202和342.对于最高位的数字1202,根据其所在的组数命名单位为“元”,其他位的数字分别命名为“壹仟”、“贰佰”、“零拾”、“贰”。
3.对于数字34,命名为“叁拾肆”。
4.在每个数字后面添加相应的单位:1202命名为“壹仟贰佰零拾贰元”,34命名为“叁拾肆分”。
5.将每一组的命名和单位合并,得到大写金额为“壹仟贰佰零拾贰元叁拾肆分”。
这就是将金额小写1202.34转换成大写的公式。
根据这个公式,可以将任何金额小写转换成大写。
如何将小写金额转换成大写金额函数公式
如何将小写金额转换成大写金额函数公式一、小写金额转换为大写金额的函数公式小写金额转换成大写金额需要用到数学函数,具体的公式如下:设原小写金额为A,则大写金额为B1、先将原小写金额转换为整数,即A1=整(A),其中“整()”表示向下取整。
2、将整数A1每四位一组分别进行处理,即将A1最高端的四位数字作为第一组处理,将第二组从右向左数的四位数字作为第二组处理,以此类推,直到将所有的数位进行分组处理,设分别为B1、B2、B3、B4、B5、B6,其中B1为纯整数,并按照从高到低的顺序依次存放各个分组。
3、对每个分组进行翻译,将“0”到“9”这十个基本数字转换为中文大写数字,例如“1”转换成“壹”、“2”转换成“贰”、“3”转换成“叁”等;将每个分组转换成中文大写金额,例如“一亿”、“十万”、“万”等;最后将所有分组的大写金额连接起来,即可得到最终的大写金额,也就是B。
具体的实现方法可以看下面的例子。
二、小写金额转换为大写金额实现过程例如,现将小写金额100,000.5元转换为大写金额为“壹拾万元伍角”。
1、先将小写金额100,000.5元转换为整数100,000元。
2、将整数100,000元每四位一组分别进行处理,得到B1=0,B2=1,B3=万,B4=0,B5=0,B6=0。
3、将分组B2和B3进行翻译,分别得到“壹拾”和“万”。
4、将分组B1和B4进行翻译,得到“零”。
5、将分组B5进行翻译,得到“元”。
6、将分组B6进行翻译,得到“伍角”。
7、将所有分组的大写金额连接起来,得到最终结果“壹拾万元伍角”。
三、小写金额转换为大写金额的注意事项1、当小数部分存在时,需对小数部分进行额外处理,将小数部分转换为中文大写金额的“角”和“分”。
2、当小写金额为零时,转换结果为“零元”。
3、当小写金额全为“0”时,转换结果为“零元零角零分”。
4、当小写金额为负数时,转换结果为“负壹圆”等。
综上所述,小写金额转换为大写金额需要使用数学函数以及中文大写数字,按照上述公式和步骤进行处理即可,注意特殊情况的处理,从而得到准确、生动、全面、有指导意义的转换结果。
小写数字转换大写金额
小写数字转换大写金额在生活和工作中,我们经常需要将小写数字转换为大写金额。
无论是填写支票、填报表格还是使用中文写信,正确地将小写数字转化为大写金额都是非常重要的。
在本文中,我们将探讨如何准确地将小写数字转换为大写金额,并提供一些实用的技巧和示例。
一、基本规则在将小写数字转换为大写金额时,需要遵循一些基本规则。
以下是一些基本规则的概述:1.数字组合:按照汉字的习惯用法,数字一般采用阿拉伯数字,如1、2、3等。
当数字大于9时,应使用相应的数位字符,如10、100、1000等。
例如,将数字123转换为大写金额应为“壹佰贰拾叁元整”。
2.零的使用:在金额中,零的使用是非常重要的。
每个整数数字之间都要使用“零”进行分隔,以示清晰。
例如,将数字1234转换为大写金额应为“壹仟贰佰叁拾肆元整”。
3.单位的使用:大写金额中需要标明货币单位,如“元”,“角”,“分”等。
例如,将数字123.45转换为大写金额应为“壹佰贰拾叁元肆角伍分”。
4.进位规则:当有0在整数数字中,如100、1000时,需要正确进位,并使用相应的数位字符。
例如,将数字1000转换为大写金额应为“壹仟元整”。
5.小数位的处理:小数位的处理也很关键,需要将小数部分转换为大写金额,并使用相应的数位字符。
例如,将数字123.45转换为大写金额应为“壹佰贰拾叁元肆角伍分”。
二、转换示例以下是几个常见的示例来演示如何准确地将小写数字转换为大写金额:1.数字1234.56转换为大写金额:壹仟贰佰叁拾肆元伍角陆分2.数字9999.99转换为大写金额:玖仟玖佰玖拾玖元玖角玖分3.数字10000.00转换为大写金额:壹万元整4.数字1转换为大写金额:壹元整以上示例可以帮助我们了解如何正确地将小写数字转换为大写金额。
根据不同的需要,我们可以灵活运用这些基本规则和转换示例,确保准确地将小写数字转换为大写金额。
三、注意事项在将小写数字转换为大写金额时,还需要注意一些事项,以避免出现错误。
excel小写转大写金额的三种常见方法Excel人民币金额自动大写
excel小写转大写金额的三种常见方法Excel人民币金额自动大写之前有财务岗的伙伴问过小雅这个问题,在工作中经常要填写中文大写金额,如果一个个填写大写金额,既耗时费力,又事半功倍。
并且面对大量数据,效率低下且极易出错。
今天小雅休息,给大家整理出来一起学习。
第一,单元格格式转大写金额1、将A列的数字小写金额,复制到B列,单击右键,选择设置单元格。
2、在左侧的类别栏中,单击:特殊,就会在右侧出现类型,选择---中文大写数字即可。
总结:这种excel自动大写金额方法优势在于速度快,不过如果带转换的小写数字含有小数,则会出错。
该方法只适合整数的转换。
第二, Numberstring函数转大写金额在Excel中有一个隐藏函数:numberstring函数,专门用来将小写数字金额转为大写金额的函数。
其函数语法为:Numberstring(number,参数),有三种参数,分别为1、2、3,其对应的转为大写的格式分别为中文大写金额,会计大写金额,数学大写金额。
请参考下面小雅的截图:总结:excel人民币金额大写使用到了numberstring函数,仅能将整数部分转为大写,无法将小数部分也转为大写金额,小数部分将四舍五入到整数部分。
第三,公式转大写金额我们在B2中输入公式:=SUBSTITUTE(SUBSTITUTE(TEXT(INT(A2),"[DBNum2][$-804]G/通用格式元"&IF(INT(A2)=A2,"整",""))&TEXT(MID(A2,FIND(".",A2&".0")+1,1),"[DBNum2][$-804]G/通用格式角")&TEXT(MID(A2,FIND(".",A2&".0")+2,1),"[DBNum2][$-804]G/通用格式分"),"零角","零"),"零分","")按回车键,双击之后就能自动填充,迅速将小写的数字金额转为标准的会计的大写数字金额。
人民币大小写转换(C#)
⼈民币⼤⼩写转换(C#)今天写了⼀个C#版本的⼤⼩写转换类,想着也要更新⼀下我的⽇记了,便把它传了上来。
哪位路过的⾼⼿,请指点。
这个类提供了⼀个静态⽅法叫做 Convert ( double ),传⼊⼀个9千万亿以内的数值它都能正确的转换为中⽂的⼤写。
基本的思路是将传⼊的数据分为整数部分和⼩数部分分别来处理,⼩数部分的处理⽐较简单,整数部分的处理我作了相应的注释。
1using System;23namespace Tools{4///<summary>5/// DigitalToChinese :实现将⼈民币的数字形式转换为中⽂格式。
6///</summary>7public class DigitalToChinese8 {9public DigitalToChinese(){10 }1112public static string Convert ( double digital ){13if ( digital == 0.00f )14return "零元整";1516string buf = ""; /* 存放返回结果 */17string strDecPart = ""; /* 存放⼩数部分的处理结果 */18string strIntPart = ""; /* 存放整数部分的处理结果 */1920/* 将数据分为整数和⼩数部分 */21char [] cDelim = {'.'};22string [] tmp = null;23string strDigital = digital.ToString ();24if ( strDigital[0] =='.'){ /* 处理数据⾸位为⼩数点的情况 */25 strDigital = "0" + strDigital;26 }27 tmp = strDigital.Split ( cDelim,2);2829/* 整数部分的处理 */30if ( tmp[0].Length > 15 ) {31throw new Exception ("数值超出处理范围。
数字转换为大写数字公式--摘自百度经验
将小写数字转化为财会大写数字编辑公式摘至:/article/d2b1d1024cb3f65c7f37d46b.html步骤/方法1. 第一种方法:通过函数嵌套实现数字转人民币大写形式的公式是:=IF(B1<0,"金额为负无效",(IF(OR(B1=0,B1=""),"(人民币)零元",IF(B1<1,"(人民币)",TEXT(INT(B1),"[dbnum2](人民币)G/通用格式")&"元"))))&IF((INT(B1*10)-INT(B1)*10)=0,IF(INT(B1*100)-INT(B1*10)*10=0,"","零"),(TEXT(INT(B1*10)-INT(B1)*10,"[dbnum2]")&"角"))&IF((INT(B1*100)-INT(B1*10)*10)=0,"整",TEXT((INT(B1*100)-INT(B1*10)*10),"[dbnum2]")&"分")数字转人民币大写形式的公式是:="大写金额:"&IF(TRIM(B1)="","",IF(B1=0,"","人民币"&IF(B1<0,"负",)&IF(INT(B1),TEXT(INT(ABS(B1)),"[dbnum2]")&"元",)&IF(INT(ABS(B1)*10)-INT(ABS(B1))*10,TEXT(INT(ABS(B1)*10)-INT(ABS(B1))*10,"[db num2]")&"角",IF(INT(ABS(B1))=ABS(B1),,IF(ABS(B1)<0.1,,"零")))&IF(ROUND(ABS(B1)*100-INT(ABS(B1)*10)*10,),TEXT(ROUND(ABS(B1)*100-INT(A BS(B1)*10)*10,),"[dbnum2]")&"分","整")))2. 第二种方法:通过宏VBA自定义函数实现第一步:按下ALT+F11组合键,或者是单击工具——宏——Visual Basic编辑器,进入Visual Basic编程环境,单击“插入” 菜单——模块,复制下面代码,保存,退出关闭。
金额小写转大写 Borland C++ Bulider 6.0 BCB 源代码 Source Code
if (i==0) XiaoXieStr=s+"00"; //如果是整数,没有小数点补两位角分, 缺陷如是有3位小数出错
else if (i==s.Length()) XiaoXieStr=s+"00";
else if (i==s.Length()-1) XiaoXieStr=s+"0";
MidDX.Delete(1,2); //如果第一位是元, 去掉比如0.01,0.11
if ((MidDX.SubString(1,2)=="零") )
MidDX.Delete(1,2); //如果第一位是零, 去掉 比如0.01
if ((MidDX.SubString(MidDX.Length()-3,4)=="元零") )
{MidDX=MidDX.SubString(1,MidDX.Length()-2)+"整";
return MidDX; }
if ((MidDX.SubString(MidDX.Length()-3,4)=="角零" ))
//阿拉伯金额数字元位是“0”,或数字中间连续有几个“0”,元位也是“0”,但角位不是“0”时,汉字大写金额可只写一个“零”字,也可不写“零”字,
//如¥1,320.56,汉字大写金额应写成人民币壹仟叁佰贰拾圆零伍角陆分,或人民币壹仟叁佰贰拾圆伍角陆分。
//又如¥1,000.56,汉字大写金额应写成人民币壹仟圆零伍角陆分,或人民币壹仟圆伍角陆分。
if (MidDX.SubString(oi,4)=="零零" )
表格小写金额变大写的公式
表格小写金额变大写的公式
在Excel中,可以使用一些内建函数和自定义公式将小写金额转换为大写金额。
下面是一个简单的示例公式,用于将小写金额转换为中文大写金额格式:
excel
=TEXT(INT(A1),"[DBNum2]")&TEXT(MOD(A1,1)*100,"[DBNum2]")&IF(A1<0,"负","")
这个公式假设小写金额存储在单元格A1中。
它首先将金额取整,然后使用TEXT函数和[DBNum2]格式代码将其转换为中文大写数字。
接着,它使用MOD函数获取金额的小数部分,乘以100,再次使用TEXT函数和[DBNum2]格式代码转换为中文大写数字。
最后,它检查金额是否为负数,如果是,则在结果前添加“负”字。
请注意,这个公式仅适用于整数和小数部分最多两位的金额。
如果金额的小数部分超过两位,或者金额非常大,可能需要更复杂的公式或自定义函数来实现正确的转换。
此外,这个公式也不考虑货币符号、千位分隔符等因素,如果需要处理这些情况,也需要对公式进行相应的修改。
小写金额转换为大写金额(c实现) (2)
前言银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据,直接关系到支付结算的准确、及时和安全。
票据和结算凭证是银行、单位和个人凭以记载帐务的会计凭证,是记载经济业务和明确经济责任的一种书面证明。
因此,填写票据和结算凭证,必须做到标准化、规范化,要要素齐全、数字正确、字迹清晰、不错漏、不潦草,防止涂改。
我的服务需要一个金额转换过程,本来想在网上找,但都是C++、JavaScript、Delphi 的Demo,还没有C的。
索性自己写一个。
参考了其它的转换算法,对我有些启发。
大多的算法都是直接分析字符串生成大写金额,即存在一个假设:源字符串的格式是正确的。
在我的过程中,用状态机的方法分析源字符串,错误时,返回空指针(我可不敢保证传给我的过程的都是##.##)。
分析出源字符串中整数部有多少个数字,是否有小数,统计结果放在一个结构体中,整数和小数部分的数字分别放在两个整形数组里。
有了统计数据就可以生成大写金额了。
转换过程有个难点:要区分万、亿等“段”,特别是个位这个“段”,这个概念是在《小写转大写金额在C++中的实现》文章中提到的。
在下面的程序中用j= ( size - i - 1 ) & 0x3,实际上是j = ( size - i - 1 ) % 4取模,j==0时为段尾,需要特殊处理。
所有的处理都是围绕0来进行的,也就是说,0才是难点。
特殊位置的0,按段分,段中第一个非0数字前的0,可能有多个;段中两个非0数字间的0;段尾的0;个位的0;十分位,角位置的0。
另外,转换的一个重点是大写金额的写法,好像大多的算法都注重转换过程而对这个问题没有深究。
我在文章后面附上转换规则。
下面是代码1./**2.* @brief 将源字符串中的小写金额转换为大写格式3.*4.* @param dest 目的字符串5.* @param src 小写金额字符串6.* @return7.* - NULL 源字符串的格式错误,返回NULL8.* - 非NULL 目的字符串的首地址9.* @note 转换根据:中国人民银行会计司编写的最新《企业、银行正确办理支付结算10.* 指南》的第114页-第115页11.*/12.char* chineseFee( char* dest, char* src )13.{14. enum15. {16.START, //开始17.MINUS, //负号18.ZEROINT, //0整数19.INTEGER, //整数20.DECIMAL, //小数点21.DECIMALfRACTION, //小数位22.END, //结束23.ERROR //错误24. } status = START;25. struct26. {27.int minus; //0为正,1为负28.int sizeInt;29.int sizeDecimal;30.int integer[10];31.int decimal[10];32. } feeInfo;33. char* NumberChar[] =34.{ "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };35. char* UnitChar[] =36.{ "整", "圆", "拾", "佰","仟", "万", "拾", "佰", "仟", "亿",37. "拾", "佰", "仟", "万亿", "拾", "佰", "仟", "亿亿",38. "角", "分", "负", "人民币" };39.40. int i, j,size; //循环变量41. int zeroTag = 0, //0标志42. decZeroTag = 0;43.44. char* pDest = dest;45. char* pSrc = src;46.47. int* pInt = feeInfo.integer;48. int* pDec = feeInfo.decimal;49.50. //初始化51. feeInfo.sizeInt = 0;52. feeInfo.sizeDecimal = 0;53. feeInfo.minus = 0;54.55. //分析字符串56. while( 1 )57. {58.switch ( *pSrc )59.{60.case '-' :61. status = ( status == START ) ? MINUS : ERROR;62. feeInfo.minus = ( status == MINUS ) ? 1 : 0;63. break;64.case '1' :65.case '2' :66.case '3' :67.case '4' :68.case '5' :69.case '6' :70.case '7' :71.case '8' :72.case '9' :73.case '0' :74. if ( *pSrc == '0' && status == ZEROINT )//|| status== START ) )75. {76.status = ERROR;77.break;78. }79. if ( status == MINUS || status == START || status== INTEGER )80. {81.if ( *pSrc == '0' && ( status == MINUS ||status == START ) )82.status = ZEROINT;83.else84.status = INTEGER;85.*pInt = (*pSrc) - 48;86.++pInt;87.++feeInfo.sizeInt;88. }89. else if ( status == DECIMAL || status ==DECIMALfRACTION )90. {91.status = DECIMALfRACTION;92.*pDec = (*pSrc) - 48;93.++pDec;94.++feeInfo.sizeDecimal;95. }96. else97. {98.status =ERROR;99. }100. break;101.case '.' :102. status = ( status == INTEGER || status == ZEROINT )103. ? DECIMAL : ERROR;104. break;105.case '\0' :106. status = ( status == INTEGER || status == DECIMALfRACTION107.|| status == ZEROINT ) ? END : ERROR;108. break;109.default :110. status = ERROR;111.}112.if ( status == END )113.break;114.else if ( status == ERROR )115.return NULL;116.117.++pSrc;118. }119.120. //只有1位小数时,设置百分位为0,使下面代码不需要区分这两种情况121. if ( feeInfo.sizeDecimal == 1 )122. {123.feeInfo.decimal[ 1 ] = 0;124.++feeInfo.sizeDecimal;125. }126. //判断是否需要打印小数部分,有小数部且十分位和百分位不都为0 127. //需要打印小数部时,zeroTag设为0,否则设为1128. if ( feeInfo.sizeDecimal ==0 //没有小数129.|| ( !feeInfo.decimal[ 0 ] && !feeInfo.decimal[ 1 ] ) ) //小数部都为0130.decZeroTag = 1;131. else132.decZeroTag = 0;133.134. //printf( "int size: %d decimal size: %d\n", feeInfo.sizeInt, feeInfo.sizeDecimal );135.136. strcpy( pDest, UnitChar[ 21 ] ); //初始化目标字符串-人民币137.138. if ( feeInfo.minus ) strcat( pDest, UnitChar[ 20 ] ); //负号139.140. //处理整数部分141. size = feeInfo.sizeInt;142. for( i = 0; i < size; ++i )143. {144.j = size - i - 1 &0x3; //j = 0时为段尾145.if ( feeInfo.integer[ i ] == 0 &&j ) //处理非段尾0146.{147.zeroTag = 1;148.}149.else if ( feeInfo.integer[ i ] == 0 && !j ) //处理段尾0150.{151.if ( feeInfo.sizeInt == 1 &&decZeroTag ) //特殊处理个位0152. strcat( pDest,NumberChar[ feeInfo.integer[ i ] ] );153.if ( feeInfo.sizeInt != 1 || decZeroTag )154. strcat( pDest, UnitChar[ size - i ] );155.zeroTag = 0;156.}157.else//处理非0158.{159.if ( zeroTag )160.{161. strcat( pDest, NumberChar[ 0 ] );162. zeroTag = 0;163.}164.strcat( pDest, NumberChar[ feeInfo.integer[ i ] ] ); 165.strcat( pDest, UnitChar[ size - i ] );166.if ( !j ) zeroTag =0; //如果是段尾,设为非标志167.}168. }169.170. if ( decZeroTag )171. {172.173.strcat( pDest, UnitChar[ 0 ] );//没有小数部,打印"整"字符174. }175. else176. {177.//十分位178.if ( feeInfo.decimal[ 0 ] )179.{180.strcat( pDest, NumberChar[ feeInfo.decimal[ 0 ] ] );181.strcat( pDest, UnitChar[ 18 ] );182.}183.else if ( feeInfo.sizeInt != 1 || feeInfo.integer[ 0 ] ) 184.{185.strcat( pDest, NumberChar[ feeInfo.decimal[ 0 ] ] );186.}187.188.//百分位不为0时189.if ( feeInfo.decimal[ 1 ] )190.{191.strcat( pDest, NumberChar[ feeInfo.decimal[ 1 ] ] );192.strcat( pDest, UnitChar[ 19 ] );193.}194. }195. return dest;196.}复制代码代码中有些地方没有注释清楚,要是有不明白的可以E-Mail我z_jingwei@。
C#把数字转换成大写金额的代码实例
C#把数字转换成⼤写⾦额的代码实例实现代码:复制代码代码如下:// 例如:(new Money(200)).ToString() == "贰佰元"namespace Skyiv.Util {using System.Text;class Test {static void Main() {for (;;) {System.Console.Write("⾦额: ");string s = System.Console.ReadLine();decimal m;try {m = decimal.Parse(s);} catch {break;}System.Console.WriteLine("⼤写: " + new Money(m));}}}// 该类重载的 ToString() ⽅法返回的是⼤写⾦额字符串class Money {public string Yuan = "元"; // “元”,可以改为“圆”、“卢布”之类public string Jiao = "⾓"; // “⾓”,可以改为“拾”public string Fen = "分"; // “分”,可以改为“美分”之类static string Digit = "零壹贰叁肆伍陆柒捌玖"; // ⼤写数字bool isAllZero = true; // ⽚段内是否全零bool isPreZero = true; // 低⼀位数字是否是零bool Overflow = false; // 溢出标志long money100; // ⾦额*100,即以“分”为单位的⾦额long value; // money100的绝对值StringBuilder sb = new StringBuilder(); // ⼤写⾦额字符串,逆序// 只读属性: "零元"public string ZeroString {get {return Digit[0] + Yuan;}}// 构造函数public Money(decimal money) {try {money100 = (long)(money * 100m);} catch {Overflow = true;}if (money100 == long.MinValue) Overflow = true;}// 重载 ToString() ⽅法,返回⼤写⾦额字符串public override string ToString() {if (Overflow) return "⾦额超出范围";if (money100 == 0) return ZeroString;string[] Unit = {Yuan,"万","亿","万","亿亿"};value = System.Math.Abs(money100);ParseSection(true);for (int i = 0; i < Unit.Length && value > 0; i++) {if (isPreZero && !isAllZero) sb.Append(Digit[0]);if (i == 4 && sb.ToString().EndsWith(Unit[2])) sb.Remove(sb.Length - Unit[2].Length, Unit[2].Length); sb.Append(Unit[i]);ParseSection(false);if ((i % 2) == 1 && isAllZero) sb.Remove(sb.Length - Unit[i].Length, Unit[i].Length);}if (money100 < 0) sb.Append("负");return Reverse();}// 解析“⽚段”: “⾓分(2位)”或“万以内的⼀段(4位)”void ParseSection(bool isJiaoFen) {string[] Unit = isJiaoFen ? new string[] {Fen,Jiao}: new string[] {"","拾","佰","仟"};isAllZero = true;for (int i = 0; i < Unit.Length && value > 0; i++) {int d = (int)(value % 10);if (d != 0) {if (isPreZero && !isAllZero) sb.Append(Digit[0]);sb.AppendFormat("{0}{1}", Unit[i], Digit[d]);isAllZero = false;}isPreZero = (d == 0);value /= 10;}}// 反转字符串string Reverse() {StringBuilder sbReversed = new StringBuilder();for (int i = sb.Length - 1; i >= 0; i--) sbReversed.Append(sb[i]);return sbReversed.ToString();}}}。
C#实现人民币大写转换示例代码
C#实现⼈民币⼤写转换⽰例代码复制代码代码如下:/// <summary>/// ⼈民币⼤写/// </summary>/// <param name="input">待转换输⼊</param>/// <param name="prefix">需要添加⼈民币前缀</param>/// <exception cref="ArgumentException" />/// <returns>转换后的结果</returns>public static string ToCapital(this string input, bool prefix = false) {#region Step1 输⼊有效性验证if (!Regex.IsMatch(input, @"(?<=-|^)\d*\.?\d*$"))throw new ArgumentException("错误的输⼊⾦额!");if (Regex.IsMatch(input, @"^\d{25,}"))throw new ArgumentException("输⼊数据太⼤⽆法转换!");#endregion#region Step2 格式化为中间字符串var positionDic = new Dictionary<int, string> {{0,"F"},{1,"J"},{2,"."},{3,"S"},{4,"B"},{5,"Q"},{6,"W"},{7,"SW"},{8,"BW"},{9,"QW"},{10,"Y"},{11,"SY"},{12,"BY"},{13,"QY"},{14,"WY"},{15,"SWY"},{16,"BWY"},{17,"QWY"},{18,"YY"},{19,"SYY"},{20,"BYY"},{21,"QYY"},{22,"WYY"},{23,"SWYY"},{24,"BWYY"},{25,"QWYY"}};input = Regex.Replace(input, @"^\.", "0.");var integerPart = Regex.Replace(input, @"^-|\..*$", "");var _matchDecimal = Regex.Match(input, @"\.\d*$", RegexOptions.None);var decimalPart = Regex.Replace(_matchDecimal.Success ? Convert.ToDouble(_matchDecimal.Value).ToString("0.00") : "00", @"0\.", "");var processStack = new Stack<string>();var charsArray = (integerPart + decimalPart).Reverse<char>();for (int i = 0; i < charsArray.Count(); i++) {processStack.Push(string.Format("{0}{1}", charsArray.ElementAt(i), positionDic[i]));}//符号处理 if (Regex.IsMatch(input, "^-", RegexOptions.None)) {processStack.Push("-");}if (prefix) {processStack.Push("¥");}var process = string.Empty;while (processStack.Count > 0) {process += processStack.Pop();}//语义处理模式队列Queue<Tuple<string, string, MatchEvaluator>> patterns = new Queue<Tuple<string, string, MatchEvaluator>>();var patternBuilder = new StringBuilder();for (int i = 3; i < positionDic.Count; i++) {patternBuilder.AppendFormat("{0}{1}", (i == 3 ? "(0(?:" : "") + positionDic[i], i == positionDic.Count - 1 ? ")+?)+" : "|");}patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(patternBuilder.ToString(), "0", null));patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"(?:\d+(?:QW|BW|SW|W|Q|B|S)?\d?YY)+", null, m => m.Value.Replace("YY", "") + "YY"));patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"(?:\d+(?:QW|BW|SW|W|Q|B|S)?\d?Y)+", null, m => m.Value.Replace("Y", "") + "Y"));patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"(?:\d+(?:Q|B|S)?\d?W)+", null, m =>m.Value.Replace("W", "") + "W"));patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"(?!^)0+\.", ".", null));patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"^0\.0J|^0\.", "", null));patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>("0J|0F", "0", null));patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>("J0?$", "JZ", null));patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"\.$|\.0+$", ".Z", null));patterns.Enqueue(Tuple.Create<string, string, MatchEvaluator>(@"^0+$|^[^.]{0}$", "0.Z", null));while (patterns.Count > 0) {var pattern = patterns.Dequeue();if (pattern.Item3 != null) {process = Regex.Replace(process, pattern.Item1, pattern.Item3);}else {process = Regex.Replace(process, pattern.Item1, pattern.Item2);}}#endregion#region Step3 翻译中间字符串StringBuilder result = new StringBuilder();var translatorDic = new Dictionary<char, string> {{'0',"零"},{'1',"壹"},{'2',"贰"},{'3',"叁"},{'4',"肆"},{'5',"伍"},{'6',"陆"},{'7',"柒"},{'8',"捌"},{'9',"玖"},{'S',"拾"},{'B',"佰"},{'Q',"仟"},{'W',"萬"},{'Y',"亿"},{'¥',"⼈民币"},{'-',"负"},{'.',"圆"},{'J',"⾓"},{'F',"分"},{'Z',"整"}};for (int i = 0; i < process.Length; i++) {result.Append(translatorDic[process[i]]);}#endregionreturn result.ToString();}。
c语言中将小写字母转换成大写字母的函数
c语言中将小写字母转换成大写字母的函数
C语言中有一个函数可以用来将小写字母转换为大写字母,该函数是toupper()。
该函数可以将小写字母转换为对应的大写字母,并将其他字符保持不变。
函数原型如下:
```
int toupper(int c);
```
其中,c是一个字符参数,代表要转换的字符。
函数返回值为转换后的字符。
需要注意的是,当c不是小写字母时,函数会直接返回c,不做转换。
下面是一个简单的例子,用来演示如何使用toupper()函数:
```c
#include <stdio.h>
#include <ctype.h>
int main() {
char c = 'a';
printf("Original character: %c\n", c);
// Convert to uppercase
c = toupper(c);
printf("Uppercase character: %c\n", c);
return 0;
}
```
输出结果如下:
```
Original character: a
Uppercase character: A
```
可以看到,原来的小写字母'a'已被转换为大写字母'A'。
如果要转换一
个字符串中的所有小写字母,可以使用循环遍历字符串中的每个字符,并分别调用toupper()函数进行转换。
C语言成序设计 实现人民币小写金额与大写金额的转换
编程实现,输入一个人民币小写金额值,转化为大写金额值输出。
先实现基本功能,如输入1002300.90,可以输出“壹佰零拾零万贰仟三佰零拾零元玖角零分”。
# include<stdio.h>main(){double r,y;int x, m,n,j,i,k,flag=0;int str1[10]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};int str2[14]={"仟","佰","拾","亿","仟","佰","拾","萬","仟","佰","拾","元","角","分"};char str3[30];printf("请输入金额(范围小于千亿):\n");scanf("%lf",&r);if(r>=1000000000000)printf("输入的数超出范围,请重新输入\n");y=r-(int)r; /*y为小数部分*/x=(int)r; /*x为整数部分*/for(i=0;i<=11;i++) /*整数部分*/{m=(int)((int)x%10);str3[11-i]=m;x=(int)(x/10);}str3[12]=(int)(y*10); /*小数部分*/str3[13]=(int)(y*100)%10;for(k=0;k<=13&&flag==0;k++) /*判断最大位是多少*/{if(str3[k]>0){flag=1;n=k;}}for(j=n;j<=13;j++)printf("%s%s",str1[str3[j]],str2[j]);printf("\n");}2.(拓展题,分值25)编程实现,输入一个人民币小写金额值,转化为大写金额值输出。
小写数字转换为中文大写的最完整C#方案
using System;using System.Text;namespace DigitToChnText{///本程序用于将小写数字转换为中文大写, 提供以下功能://2. 能识别并处理任何错误输入//3. 算法稳定, 速度较快, 中文大写比较符合语言习惯/// 本程序用于将小写数字变成大写中文数字class DigitToChnText{private readonly char[] chnText;private readonly char[] chnDigit;public DigitToChnText(){chnText = new char[]{'零', '一', '二', '三', '四', '五', '六', '七', '八', '九'};chnDigit = new char[]{'十', '百', '千', '万', '亿'};}public string Convert( string strDigit ){// 检查输入数字decimal dec;try{dec = decimal.Parse( strDigit );}catch( FormatException ){throw new Exception("输入数字的格式不正确。
");}catch( Exception e ){throw e;}if( dec <= -10000000000000000m || dec >= 10000000000000000m ) {throw new Exception( "输入数字太大或太小,超出范围。
c语言将阿拉伯数字变为大写,使用C#实现阿拉伯数字到大写中文的转换
c语⾔将阿拉伯数字变为⼤写,使⽤C#实现阿拉伯数字到⼤写中⽂的转换先记下来,以备后⽤!////// ⾦额转为⼤写⾦额///public class MoneyConvertChinese{////// ⾦额转为⼤写⾦额/////////public string MoneyToChinese(string LowerMoney){string functionReturnValue = null;bool IsNegative = false; // 是否是负数if (LowerMoney.Trim().Substring(0, 1) == "-"){// 是负数则先转为正数LowerMoney = LowerMoney.Trim().Remove(0, 1);IsNegative = true;}string strLower = null;string strUpart = null;string strUpper = null;int iTemp = 0;// 保留两位⼩数 123.489→123.49 123.4→123.4LowerMoney = Math.Round(double.Parse(LowerMoney), 2).ToString();if (LowerMoney.IndexOf(".") > 0){if (LowerMoney.IndexOf(".") == LowerMoney.Length - 2)LowerMoney = LowerMoney + "0";}}else{LowerMoney = LowerMoney + ".00";}strLower = LowerMoney;iTemp = 1;strUpper = "";while (iTemp <= strLower.Length){switch (strLower.Substring(strLower.Length - iTemp, 1)) {case ".":strUpart = "圆";break;case "0":strUpart = "零";break;case "1":strUpart = "壹";break;case "2":strUpart = "贰";break;case "3":strUpart = "叁";break;case "4":strUpart = "肆";break;case "5":case "6":strUpart = "陆";break;case "7":strUpart = "柒";break;case "8":strUpart = "捌";break;case "9":strUpart = "玖";break;}switch (iTemp){case 1:strUpart = strUpart + "分"; break;case 2:strUpart = strUpart + "⾓"; break;case 3:strUpart = strUpart + ""; break;case 4:strUpart = strUpart + ""; break;case 5:strUpart = strUpart + "拾"; break;case 6:strUpart = strUpart + "佰";strUpart = strUpart + "仟"; break;case 8:strUpart = strUpart + "万"; break;case 9:strUpart = strUpart + "拾"; break;case 10:strUpart = strUpart + "佰"; break;case 11:strUpart = strUpart + "仟"; break;case 12:strUpart = strUpart + "亿"; break;case 13:strUpart = strUpart + "拾"; break;case 14:strUpart = strUpart + "佰"; break;case 15:strUpart = strUpart + "仟"; break;case 16:strUpart = strUpart + "万"; break;default:strUpart = strUpart + ""; break;strUpper = strUpart + strUpper;iTemp = iTemp + 1;}strUpper = strUpper.Replace("零拾", "零");strUpper = strUpper.Replace("零佰", "零");strUpper = strUpper.Replace("零仟", "零");strUpper = strUpper.Replace("零零零", "零");strUpper = strUpper.Replace("零零", "零");strUpper = strUpper.Replace("零⾓零分", "整");strUpper = strUpper.Replace("零分", "整");strUpper = strUpper.Replace("零⾓", "零");strUpper = strUpper.Replace("零亿零万零圆", "亿圆"); strUpper = strUpper.Replace("亿零万零圆", "亿圆"); strUpper = strUpper.Replace("零亿零万", "亿");strUpper = strUpper.Replace("零万零圆", "万圆"); strUpper = strUpper.Replace("零亿", "亿");strUpper = strUpper.Replace("零万", "万");strUpper = strUpper.Replace("零圆", "圆");strUpper = strUpper.Replace("零零", "零");// 对壹圆以下的⾦额的处理if (strUpper.Substring(0, 1) == "圆"){strUpper = strUpper.Substring(1, strUpper.Length - 1); }if (strUpper.Substring(0, 1) == "零"){strUpper = strUpper.Substring(1, strUpper.Length - 1); }if (strUpper.Substring(0, 1) == "⾓"){strUpper = strUpper.Substring(1, strUpper.Length - 1); }if (strUpper.Substring(0, 1) == "分")strUpper = strUpper.Substring(1, strUpper.Length - 1);}if (strUpper.Substring(0, 1) == "整"){strUpper = "零圆整";}functionReturnValue = strUpper;if (IsNegative == true){return "负" + functionReturnValue;}else{return functionReturnValue;}}}测试代码:static void Main(string[] args){Console.Write("请输⼊要转成⼤写的数字:");string str = Console.ReadLine();Console.WriteLine("⼤写:" + new MoneyConvertChinese().MoneyToChinese(str)); Console.ReadLine();}测试结果:下⾯是其它⽹友的补充:using System;namespace ConsoleApp{////// 本类实现阿拉伯数字到⼤写中⽂的转换/// 请调⽤NumToChn⽅法///public class NumFormat{public NumFormat(){//// TODO: 在此处添加构造函数逻辑//}// 转换数字private char ToNum(char x){string strChnNames="零⼀⼆三四五六七⼋九";string strNumNames="0123456789";return strChnNames[strNumNames.IndexOf(x)];}// 转换万以下整数private string ChangeInt(string x){string[] strArrayLevelNames=new string[4] {"","⼗","百","千"}; string ret = "";int i;for (i=x.Length-1;i>=0;i--)if (x[i] == '0')ret = ToNum(x[i]) + ret;elseret = ToNum(x[i]) + strArrayLevelNames[x.Length-1-i] + ret; while ((i=ret.IndexOf("零零"))!=-1)ret=ret.Remove(i, 1);if (ret[ret.Length-1]=='零' && ret.Length>1)ret=ret.Remove(ret.Length-1,1);if (ret.Length>=2 && ret.Substring(0,2)=="⼀⼗")return ret;}// 转换整数private string ToInt(string x){int len = x.Length;string ret,temp;if (len<=4)ret = ChangeInt(x);else if (len<=8){ret = ChangeInt(x.Substring(0,len-4)) + "万"; temp = ChangeInt(x.Substring(len-4,4));if (temp.IndexOf("千")==-1 && temp!="")ret += "零" + temp;elseret += temp;}else{ret=ChangeInt(x.Substring(0,len-8)) + "亿"; temp=ChangeInt(x.Substring(len-8,4));if (temp.IndexOf("千")==-1 && temp!="")ret += "零" + temp;elseret += temp;ret += "万";temp = ChangeInt(x.Substring(len-4,4));if (temp.IndexOf("千")==-1 && temp!="")ret += "零" + temp;elseret += temp;}if ((i=ret.IndexOf("零万"))!=-1)ret = ret.Remove(i+1,1);while ((i=ret.IndexOf("零零"))!=-1)ret = ret.Remove(i,1);if (ret[ret.Length-1]=='零' && ret.Length>1)ret = ret.Remove(ret.Length-1,1);return ret;}private string ToDecimal(string x){string ret="";for (int i=0;iret += ToNum(x[i]);return ret;}public string NumToChn(string x){if (x.Length==0)return "";string ret="";if (x[0]=='-'){ret="负";x=x.Remove(0,1);}if (x[0].ToString()==".")x="0"+x;if (x[x.Length-1].ToString()==".")x=x.Remove(x.Length-1,1);if (x.IndexOf(".")>-1)ret += ToInt(x.Substring(0,x.IndexOf(".")))+"点"+ToDecimal(x.Substring(x.IndexOf(".")+1)); elseret += ToInt(x);}}}测试⼯程using System;namespace ConsoleApp{class MainClass{static void Main(string[] args){/*System.Console.WriteLine("Hello, The World!"); System.Console.WriteLine("My Love!");ClassTest ct = new ClassTest();System.Console.WriteLine(ct.Get_Str());*//*// 重载运算符MyVector v1 = new MyVector(5, 12);MyVector v2 = new MyVector(4, 3);MyVector v3 = new MyVector();v3 = v1 + v2;System.Console.WriteLine("{0}测试⼀下", v3.Length); */// 转换成⼤写数字NumFormat nf = new NumFormat();string x;while (true){Console.Write("X=");x = Console.ReadLine();if (x == "") break;} } } }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前言银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据,直接关系到支付结算的准确、及时和安全。
票据和结算凭证是银行、单位和个人凭以记载帐务的会计凭证,是记载经济业务和明确经济责任的一种书面证明。
因此,填写票据和结算凭证,必须做到标准化、规范化,要要素齐全、数字正确、字迹清晰、不错漏、不潦草,防止涂改。
我的服务需要一个金额转换过程,本来想在网上找,但都是C++、JavaScript、Delphi 的Demo,还没有C的。
索性自己写一个。
参考了其它的转换算法,对我有些启发。
大多的算法都是直接分析字符串生成大写金额,即存在一个假设:源字符串的格式是正确的。
在我的过程中,用状态机的方法分析源字符串,错误时,返回空指针(我可不敢保证传给我的过程的都是##.##)。
分析出源字符串中整数部有多少个数字,是否有小数,统计结果放在一个结构体中,整数和小数部分的数字分别放在两个整形数组里。
有了统计数据就可以生成大写金额了。
转换过程有个难点:要区分万、亿等“段”,特别是个位这个“段”,这个概念是在《小写转大写金额在C++中的实现》文章中提到的。
在下面的程序中用j= ( size - i - 1 ) & 0x3,实际上是j = ( size - i - 1 ) % 4取模,j==0时为段尾,需要特殊处理。
所有的处理都是围绕0来进行的,也就是说,0才是难点。
特殊位置的0,按段分,段中第一个非0数字前的0,可能有多个;段中两个非0数字间的0;段尾的0;个位的0;十分位,角位置的0。
另外,转换的一个重点是大写金额的写法,好像大多的算法都注重转换过程而对这个问题没有深究。
我在文章后面附上转换规则。
下面是代码1./**2.* @brief 将源字符串中的小写金额转换为大写格式3.*4.* @param dest 目的字符串5.* @param src 小写金额字符串6.* @return7.* - NULL 源字符串的格式错误,返回NULL8.* - 非NULL 目的字符串的首地址9.* @note 转换根据:中国人民银行会计司编写的最新《企业、银行正确办理支付结算10.* 指南》的第114页-第115页11.*/12.char* chineseFee( char* dest, char* src )13.{14. enum15. {16.START, //开始17.MINUS, //负号18.ZEROINT, //0整数19.INTEGER, //整数20.DECIMAL, //小数点21.DECIMALfRACTION, //小数位22.END, //结束23.ERROR //错误24. } status = START;25. struct26. {27.int minus; //0为正,1为负28.int sizeInt;29.int sizeDecimal;30.int integer[10];31.int decimal[10];32. } feeInfo;33. char* NumberChar[] =34.{ "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };35. char* UnitChar[] =36.{ "整", "圆", "拾", "佰","仟", "万", "拾", "佰", "仟", "亿",37. "拾", "佰", "仟", "万亿", "拾", "佰", "仟", "亿亿",38. "角", "分", "负", "人民币" };39.40. int i, j,size; //循环变量41. int zeroTag = 0, //0标志42. decZeroTag = 0;43.44. char* pDest = dest;45. char* pSrc = src;46.47. int* pInt = feeInfo.integer;48. int* pDec = feeInfo.decimal;49.50. //初始化51. feeInfo.sizeInt = 0;52. feeInfo.sizeDecimal = 0;53. feeInfo.minus = 0;54.55. //分析字符串56. while( 1 )57. {58.switch ( *pSrc )59.{60.case '-' :61. status = ( status == START ) ? MINUS : ERROR;62. feeInfo.minus = ( status == MINUS ) ? 1 : 0;63. break;64.case '1' :65.case '2' :66.case '3' :67.case '4' :68.case '5' :69.case '6' :70.case '7' :71.case '8' :72.case '9' :73.case '0' :74. if ( *pSrc == '0' && status == ZEROINT )//|| status== START ) )75. {76.status = ERROR;77.break;78. }79. if ( status == MINUS || status == START || status== INTEGER )80. {81.if ( *pSrc == '0' && ( status == MINUS ||status == START ) )82.status = ZEROINT;83.else84.status = INTEGER;85.*pInt = (*pSrc) - 48;86.++pInt;87.++feeInfo.sizeInt;88. }89. else if ( status == DECIMAL || status ==DECIMALfRACTION )90. {91.status = DECIMALfRACTION;92.*pDec = (*pSrc) - 48;93.++pDec;94.++feeInfo.sizeDecimal;95. }96. else97. {98.status =ERROR;99. }100. break;101.case '.' :102. status = ( status == INTEGER || status == ZEROINT )103. ? DECIMAL : ERROR;104. break;105.case '\0' :106. status = ( status == INTEGER || status == DECIMALfRACTION107.|| status == ZEROINT ) ? END : ERROR;108. break;109.default :110. status = ERROR;111.}112.if ( status == END )113.break;114.else if ( status == ERROR )115.return NULL;116.117.++pSrc;118. }119.120. //只有1位小数时,设置百分位为0,使下面代码不需要区分这两种情况121. if ( feeInfo.sizeDecimal == 1 )122. {123.feeInfo.decimal[ 1 ] = 0;124.++feeInfo.sizeDecimal;125. }126. //判断是否需要打印小数部分,有小数部且十分位和百分位不都为0 127. //需要打印小数部时,zeroTag设为0,否则设为1128. if ( feeInfo.sizeDecimal ==0 //没有小数129.|| ( !feeInfo.decimal[ 0 ] && !feeInfo.decimal[ 1 ] ) ) //小数部都为0130.decZeroTag = 1;131. else132.decZeroTag = 0;133.134. //printf( "int size: %d decimal size: %d\n", feeInfo.sizeInt, feeInfo.sizeDecimal );135.136. strcpy( pDest, UnitChar[ 21 ] ); //初始化目标字符串-人民币137.138. if ( feeInfo.minus ) strcat( pDest, UnitChar[ 20 ] ); //负号139.140. //处理整数部分141. size = feeInfo.sizeInt;142. for( i = 0; i < size; ++i )143. {144.j = size - i - 1 &0x3; //j = 0时为段尾145.if ( feeInfo.integer[ i ] == 0 &&j ) //处理非段尾0146.{147.zeroTag = 1;148.}149.else if ( feeInfo.integer[ i ] == 0 && !j ) //处理段尾0150.{151.if ( feeInfo.sizeInt == 1 &&decZeroTag ) //特殊处理个位0152. strcat( pDest,NumberChar[ feeInfo.integer[ i ] ] );153.if ( feeInfo.sizeInt != 1 || decZeroTag )154. strcat( pDest, UnitChar[ size - i ] );155.zeroTag = 0;156.}157.else//处理非0158.{159.if ( zeroTag )160.{161. strcat( pDest, NumberChar[ 0 ] );162. zeroTag = 0;163.}164.strcat( pDest, NumberChar[ feeInfo.integer[ i ] ] ); 165.strcat( pDest, UnitChar[ size - i ] );166.if ( !j ) zeroTag =0; //如果是段尾,设为非标志167.}168. }169.170. if ( decZeroTag )171. {172.strcat( pDest, UnitChar[ 0 ] );//没有小数部,打印"整"字符173. }174. else175. {176.//十分位177.if ( feeInfo.decimal[ 0 ] )178.{179.strcat( pDest, NumberChar[ feeInfo.decimal[ 0 ] ] );180.strcat( pDest, UnitChar[ 18 ] );181.}182.else if ( feeInfo.sizeInt != 1 || feeInfo.integer[ 0 ] ) 183.{184.strcat( pDest, NumberChar[ feeInfo.decimal[ 0 ] ] );185.}186.187.//百分位不为0时188.if ( feeInfo.decimal[ 1 ] )189.{190.strcat( pDest, NumberChar[ feeInfo.decimal[ 1 ] ] );191.strcat( pDest, UnitChar[ 19 ] );192.}193. }194. return dest;195.}复制代码代码中有些地方没有注释清楚,要是有不明白的可以E-Mail我z_jingwei@。