在一次面试中遇到一个有意思的小算法题:要求将阿拉伯数字转为汉字显示出来(包含单位)。
当时虽然实现出来,但是代码写的有点凌乱。所以回家后,重新整理了一下。
当时虽然实现出来,但是代码写的有点凌乱。所以回家后,重新整理了一下。
这个算法有几个小的注意点:
1、中文字符占两个字节,所以如果用C语言实现,需要用char数组的形式保存单个汉字。
2、如果数字中出现连续的零,需要把它替换为单一的零。
3、在亿、万、元的前面一个汉字不可以为零(人民币读取方式决定)。
4、double数值可分为整数部分和小数部分。小数部分较简单,整数部分需要根据这个数字所在的位数匹配上对应的单位。
具体方法是:设置一个单位映射字符串表g_strUnit,可视为一个简单的HashTable。然后从头开始读取整数字符串的每个
字符,若这个字符在整数字符串的位置为i,这个字符后面的单位就是g_strUnit[length-1-i]。
代码
/******************************************************************************* Project Code : Account File name : Author : Latte Description : 阿拉伯数字转为中文字符串 Function List : -------------------------------------------------------------------------------- History: Date Author Modification Latte created file. *******************************************************************************/ #include "stdafx.h" #include <string> #include <iostream> using namespace std; #define MAX 100 string g_strDigit[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; string g_strUnit[] = {"圆", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰"}; string g_strUnit2[] = {"角", "分"}; /******************************************************************************* Func Name : ReplaceSubStr Date Created : 2014-07-03 Author : Latte Description : 将源字符串strOrig中第一个匹配strSub的子串部分替换为strReplace Input : string &strOrig, string strSub, string strReplace Output : string &strOrig Return : int Caution : 返回值如果为-1,则表示替换失败或未找到替换项 *******************************************************************************/ int ReplaceSubStr(string &strOrig, string strSub, string strReplace) { int pos = (int)strOrig.find(strSub); int length = (int)strSub.length(); if (pos >= 0) { strOrig.replace(pos, length, strReplace); return 0; } return -1; } /******************************************************************************* Func Name : NumToChineseStr Date Created : 2014-07-03 Author : Latte Description : 将人民币double数值转化为人民币汉字string Input : double money Output : Return : string Caution : *******************************************************************************/ string NumToChineseStr(double money) { int i = 0; int ret = 0; int length = 0; char *p = NULL; char *pcDecimal = NULL; //保存小数部分字符 char czNumber[MAX] = {0}; //保存完整数字部分字符 string strResult; cout << "======================================" << endl; cout << money << endl; //判断是否为小数 if (money < 0) { strResult = "不支持读负数"; return strResult; } //将数字转为数字字符串,利用sprintf_s的正则转换 sprintf_s(czNumber, MAX, "%.15lg", money); printf("[No.0]%s\n", czNumber); //如果数字是太大或太小的数,因为已经转为科学计数,所以会含有e字符 p = strchr(czNumber,'e'); if (NULL!=p) { strResult = "不支持读太大或太小的数"; return strResult; } p = strchr(czNumber, '.'); if (NULL != p) { p[0] = 0; pcDecimal = p + 1; } length = (int)strlen(czNumber); for (i = 0; i<length; i++) { if ('0' == czNumber[i] && 0 != ((length-1-i) % 4)) { strResult += g_strDigit[czNumber[i] - '0']; } else { strResult += g_strDigit[czNumber[i] - '0'] + g_strUnit[length-1-i]; } } cout << "[No.1]把数字直接替换为汉字: \n" << strResult << endl; //把strResult中的所有"零零"子串替换为"零" while (1) { ret = ReplaceSubStr(strResult, "零零", "零"); if (ret < 0) { break; } } cout << "[No.2]替换所有零零为零: \n" << strResult << endl; ReplaceSubStr(strResult, "零亿", "亿"); ReplaceSubStr(strResult, "零万", "万"); if (strResult != "零圆") //如果整数部分全为0,则不要去除元单位前面的零 { ReplaceSubStr(strResult, "零圆", "圆"); } cout << "[No.3]去除零亿、零万、零圆前面的零: \n" << strResult << endl; //小数精确到两位数,即精确到单位分 if (NULL != pcDecimal) { //如果小数部分有数值而整数部分为0,则删除字符串中的零元 if (strResult == "零圆") { strResult.clear(); } i = 0; while (1) { if (0 == pcDecimal[i] || i >= 2) break; strResult += g_strDigit[pcDecimal[i] - '0'] + g_strUnit2[i]; i++; } } cout << "[No.4]小数精确到两位数,即精确到单位分: \n" << strResult << endl; return strResult; } int main(void) { //cout << "Result: " << NumToChineseStr(0.00) << endl; //cout << "Result: " << NumToChineseStr(-345.67) << endl; //cout << "Result: " << NumToChineseStr(1000.0) << endl; cout << "Result: " << NumToChineseStr(130040600090.012) << endl; return 0; }
结果
相关推荐
综上所述,人民币大小写转换是一个涉及到中国传统文化和金融法规的IT问题。在实现这样的功能时,开发者不仅需要理解数字与汉字的对应关系,还要熟悉财务规则,并能够编写出健壮的代码来处理各种可能的情况。
总之,人民币大小写转换是一项涉及中国传统文化和金融规范的编程任务,通过合理的算法设计和代码实现,可以高效、准确地完成数字与汉字之间的转换。在理解和实现这个功能时,我们需要深入理解相关规则,同时考虑代码...
针对“C# 人民币大小写转换”这一主题,我们需要探讨如何利用C#编程语言处理人民币金额的格式化,特别是将其从阿拉伯数字形式转换为中文大写,这在财务单据中是必不可少的,因为中文大写可以避免因数字混淆导致的...
人民币的大小写转换是财务和会计领域中的基本操作,因为在中国,正式的财务文件中通常要求金额用大写汉字表示,以防止篡改和增加准确性。这个“人民币转换程序”就是为了解决这样的问题而设计的。 程序的核心功能是...
1、该dll能将阿拉伯数字转换为汉字数字或者中文大写金额。例如1234567.07可转换为: “一百二十三万四千五百六十七点零七”或“壹佰贰拾叁万肆仟伍佰陆拾柒圆零柒分”。 目前支持正负千亿以内(整数部分不超过12位)...
本项目是关于"汉语数字串与阿拉伯数字串间转换小工具",它使用C语言编写,专注于字符串操作,能够实现两种数字表示形式的互换,并且支持汉语数字串的大小写转换。这个工具对于处理中文数字和阿拉伯数字之间的转换...
这个“vb数字、金额大小写转换源码”提供了一种解决方案,帮助开发者将数字或者金额从阿拉伯数字形式转换为中文的大写形式,以满足中国财务规范的要求,比如在填写支票或财务报表时。 在中文中,数字的大小写转换有...
"大小写转换"是程序的核心功能,将阿拉伯数字的人民币金额转换为规范的大写汉字,如“壹”、“贰”等,以符合财务报告的标准。"语音"则表示程序有语音合成技术,能够读出转换后的金额,提供额外的便利性。 【压缩...
总之,人民币大小写转换类库是软件开发中一个重要的工具,它简化了数字与中文大写之间的转换,提高了财务软件的质量和合规性。通过理解和应用这些类库,开发者可以更高效地处理与人民币金额相关的编程任务。
将阿拉伯数字复制粘贴或输入到“输入小写数字金额”中,比如(123456),然后单击“转换为大写金额”按钮。就会在“显示中文大写金额”框中显示自动转换完成的中文大写内容...
2. **自定义映射表**:在数字大小写转换中,需要创建一个映射表,将阿拉伯数字(0-9)映射到对应的汉字大写或小写。例如,数字0对应零,数字1对应壹,依此类推。 3. **循环和条件判断**:遍历数字的每一位,根据...
首先,人民币大小写转换是金融系统中不可或缺的一部分,因为在中国,正规的财务报表和发票通常要求金额以汉字大写的形式呈现,以减少因笔误导致的错误。例如,数字10000应转换为汉字“壹万”。 在Java中实现这一...
### 实验一:人民币大小写转换 #### 一、引言 本次实验的主题是对人民币数字进行大写转换,这是在财务、会计以及其他涉及到货币处理的领域中非常实用的一项技能。通过对数字进行大写转换,可以有效防止金额被篡改...
标签中的“大小写转换”和“数字大小写转换”进一步强调了这个工具的功能特性。 在压缩包文件“大小写转换.xlsx”中,我们可以推测这可能是一个Excel模板或者一个包含了宏的Excel工作簿。Excel作为常用的电子表格...
"数字大小写转换"这个主题主要涉及到如何将阿拉伯数字(0-9)转化为汉字的大写形式,以便于财务报表、发票和银行单据等正式文档的填写。这种转换在计算机程序中通常通过特定的算法实现,确保准确性和一致性。 首先...
人民币金额大小写转换工具的主要功能是将输入的阿拉伯数字金额自动转换为规范的中文大写形式。这极大地简化了财务人员的工作流程,避免了手动转换可能出现的错误。工具不仅适用于个人,也广泛应用于各类企事业单位的...
# 本文是已文件为例子,中文数字组合格式支持两种,如69--->...大小写可自行替换 # 用按字符提取转换,如一百二十四 提取到 1 100 2 10 4, # ----> 1*100+2*10+4,偶数位必定是能==0, #测试了下,十亿,百亿都可以转
《人民币大小写转换工具详解与应用》 在日常的财务工作中,准确无误地处理人民币金额是至关重要的,尤其在填写支票、合同等正式文件时,必须使用规范的中文大写数字来表示金额,以避免欺诈和误解。为此,"人民币...
不满意现有的阿拉伯数字转中文数字代码的效果,自己写了一个更加地道的代码,将如“一十一”等处理成“十一”;最大处理16位数字,具体数位规则如下:16(千兆),15(百兆),14(十兆),13(兆),12(千亿),11(百亿),10...