人民币大小写转换(阿拉伯数字和汉字转换)
最近在网上看到一个关于数字转换人民币大写的算法的一篇博客,很好,就收藏了,算法直接copy原作者的。自己做了一点小改动:
1.以CString代替,封装成类。
2.修复超过"亿"时显示"亿万"的bug。
3.扩大检索范围至"千万亿(lg16)"。
如果各位有更好的算法,多贡献出来大家研究研究,废话补多说,直接贴出来供大家参考!
算法转载作者博客为:http://www.cnblogs.com/jingmoxukong/p/3821339.html
// numberConvert.h#ifndef _NUMBERCONVERT_H_
#define _NUMBERCONVERT_H_#include <atlstr.h>
#include <CString>
#include <String>#ifndef ArrayCount#define ArrayCount(Array) (sizeof(Array)/sizeof(Array[0]))
#endif // ArrayCount#ifndef SAFE_DELETE
# define SAFE_DELETE(p) { try { delete p; } catch (...) { } p = nullptr; }
#endif // SAFE_DELETE#ifndef SAFE_DELETE_ARRAY
# define SAFE_DELETE_ARRAY(pArr) { if (pArr) { delete [] (pArr); (pArr) = nullptr; } }
#endif // SAFE_DELETE_ARRAYusing namespace std;
class NumberConvert
{
public:NumberConvert();~NumberConvert();// 将源字符串strOrig中第一个匹配strSub的子串部分替换为strReplaceint ReplaceSubStr(CString &strOrig, CString strSub, CString strReplace);// 将人民币double数值转化为人民币汉字CStringCString NumToChineseStr(double money);private:CString* m_pstrDigit;CString* m_pstrUnit1;CString* m_pstrUnit2;
};#endif //_NUMBERCONVERT_H_
// numberConvert.cpp#include "numberConvert.h"NumberConvert::NumberConvert()
{CString strDigit[] = { _T("零"), _T("壹"), _T("贰"), _T("叁"), _T("肆"), _T("伍"), _T("陆"), _T("柒"), _T("捌"), _T("玖") };CString strUnit[] = { _T("圆"), _T("拾"), _T("佰"), _T("仟"), _T("万"), _T("拾"), _T("佰"), _T("仟"), _T("亿"), _T("拾"), _T("佰"), _T("仟"), _T("万"), _T("拾"), _T("佰"), _T("仟") };CString strUnit2[] = { _T("角"), _T("分") };int iLen = ArrayCount(strDigit);m_pstrDigit = new CString[iLen];for (int i = 0; i < iLen; ++i){m_pstrDigit[i] = strDigit[i];}iLen = ArrayCount(strUnit);m_pstrUnit1 = new CString[iLen];for (int i = 0; i < iLen; ++i){m_pstrUnit1[i] = strUnit[i];}iLen = ArrayCount(strUnit2);m_pstrUnit2 = new CString[iLen];for (int i = 0; i < iLen; ++i){m_pstrUnit2[i] = strUnit2[i];}
}NumberConvert::~NumberConvert()
{SAFE_DELETE_ARRAY(m_pstrDigit);SAFE_DELETE_ARRAY(m_pstrUnit1);SAFE_DELETE_ARRAY(m_pstrUnit2);
}int NumberConvert::ReplaceSubStr(CString &strOrig, CString strSub, CString strReplace)
{int pos = (int)strOrig.Find(strSub);if (pos >= 0){strOrig.Replace(strSub, strReplace);return 0;}return -1;
}CString NumberConvert::NumToChineseStr(double money)
{int i = 0;int ret = 0;int length = 0;char *p = NULL;char *pcDecimal = NULL; //保存小数部分字符char czNumber[MAX_PATH] = { 0 }; //保存完整数字部分字符CString strResult;//判断是否为小数if (money < 0){strResult += _T("负");money = ::abs(money);}//将数字转为数字字符串,利用sprintf_s的正则转换_stprintf_s(czNumber, MAX_PATH, _T("%.16lg"), money);//如果数字是太大或太小的数,因为已经转为科学计数,所以会含有e字符p = _tcschr(czNumber, _T('e'));if (NULL != p){strResult = _T("金额超出计算范畴");return strResult;}p = _tcschr(czNumber, _T('.'));if (NULL != p){p[0] = 0;pcDecimal = p + 1;}length = (int)_tcslen(czNumber);for (i = 0; i < length; ++i){if (_T('0') == czNumber[i] && 0 != ((length - 1 - i) % 4)){strResult += m_pstrDigit[czNumber[i] - _T('0')];}else{strResult += m_pstrDigit[czNumber[i] - _T('0')] + m_pstrUnit1[length - i - 1];}}//把strResult中的所有"零零"子串替换为"零"while (true){ret = ReplaceSubStr(strResult, _T("零零"), _T("零"));if (ret < 0){break;}}ReplaceSubStr(strResult, _T("零亿"), _T("亿"));ReplaceSubStr(strResult, _T("零万"), _T("万"));ReplaceSubStr(strResult, _T("亿万"), _T("亿"));//如果整数部分全为0,则不要去除元单位前面的零if (_tcscmp(strResult, _T("零圆")) != 0){ReplaceSubStr(strResult, _T("零圆"), _T("圆"));}//小数精确到两位数,即精确到单位分if (NULL != pcDecimal){//如果小数部分有数值而整数部分为0,则删除字符串中的零元if (_tcscmp(strResult, _T("零圆")) == 0|| _tcscmp(strResult, _T("零")) == 0){strResult.Empty();}i = 0;while (true){if (0 == pcDecimal[i] || i >= 2){break;}strResult += m_pstrDigit[pcDecimal[i] - _T('0')] + m_pstrUnit2[i];++i;}}// 剔除掉"圆"字strResult.Replace(_T("圆"), _T(""));return strResult;
}
人民币大小写转换(阿拉伯数字和汉字转换)相关推荐
- php汉字转换拼音,PHP汉字转换拼音的函数代码
/************ *汉字转换拼音Class *************/ class pin{ function Pinyin($_String, $_Code='gb2312'){ $_D ...
- php汉字转换拼音,PHP汉字转换拼音
搜索热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. /************ *汉字转换拼音Class *2012.12 **** ...
- 汉字转换拼音 java_java 汉字转换拼音
maven依赖 com.belerweb pinyin4j 2.5.0 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourcef ...
- Python实现银行金额大写汉字转换【简单易懂】!!
Python实现银行金额大写汉字转换[简单易懂] 业务需求: •银行电子支票业务在金额部分需要使用大写的汉字,因此需要将用户录入的数字信息转变为汉字. •目前只需完成1~5位整数转换即可. 关键技术分 ...
- JavaScript实现人民币大小写转换
当使用支票或者签署合同时,需要用到大写人民币,常用的中文大写包括零.壹.贰.叁.肆.伍.陆.柒.捌.玖.拾.佰.仟.万.亿.本文介绍下如何使用JavaScript实现将阿拉伯数字的人民币转换成大写. ...
- Java实现人民币大小写转换
思路和具体方法都在注释中说明 package ClassicArithmetic;import java.util.Scanner;/** @author:LOHAS翀* @time:2019/11/ ...
- 人民币大小写格式转换
using System; using System.Text; using System.Text.RegularExpressions; /// <summary> /// 人民币大小 ...
- java人民币大小写转换_人民币大小写转换
usingSystem;usingSystem.Text;usingSystem.Text.R using System; using System.Text; using System.Text.R ...
- 巧用Excel 轻松转换人民币大小写
巧用Excel 轻松转换人民币大小写 2010-02-08 11:22 要将人民币小写金额转换成大写格式,用Excel提供的格式,将自定义格式类型中的"[dbnum2]G/通用格 ...
最新文章
- svg animation应用之-描边效果
- Java学习正嗨Day2!
- vnc oracle solaris,在Solaris下安装VNC 远程安装Oracle
- 前端学习(3280):iterator
- flask-前端-requests之response对应关系 json
- 小米手机困境,米粉伤心,黄牛伤钱
- 转速器盘课程设计 大批量
- ue的 linux版本,UltraEdit Linux版RPM包 64位 V16.1.0.22
- 【AI视野·今日CV 计算机视觉论文速览 第241期】Wed, 1 Dec 2021
- 计算机主机实际功率,PC动力之源,一起来算算电源真实功率吧!
- linux 硬盘合并使用方法,Linux硬盘合并的实现代码
- OpenCV + CPP 系列(九)颜色空间
- Redis持久化(一)-RDB文件的创建和载入
- ubuntu命令 图片 壁纸_[教程]Ubuntu下完整配置自动壁纸切换
- Word2003入门动画教程25:添加或改变Word页面边框
- eclipse 主类中明明有main方法且没有写成mian,还老是提示找不到main方法。
- JAVA语言的由来以及相关情况介绍
- Ubuntu boot menu
- (转)OLAP和多维数据模型
- FAT、FAT32和exFAT文件系统