最近在网上看到一个关于数字转换人民币大写的算法的一篇博客,很好,就收藏了,算法直接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;
}






												

人民币大小写转换(阿拉伯数字和汉字转换)相关推荐

  1. php汉字转换拼音,PHP汉字转换拼音的函数代码

    /************ *汉字转换拼音Class *************/ class pin{ function Pinyin($_String, $_Code='gb2312'){ $_D ...

  2. php汉字转换拼音,PHP汉字转换拼音

    搜索热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. /************ *汉字转换拼音Class *2012.12 **** ...

  3. 汉字转换拼音 java_java 汉字转换拼音

    maven依赖 com.belerweb pinyin4j 2.5.0 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourcef ...

  4. Python实现银行金额大写汉字转换【简单易懂】!!

    Python实现银行金额大写汉字转换[简单易懂] 业务需求: •银行电子支票业务在金额部分需要使用大写的汉字,因此需要将用户录入的数字信息转变为汉字. •目前只需完成1~5位整数转换即可. 关键技术分 ...

  5. JavaScript实现人民币大小写转换

    当使用支票或者签署合同时,需要用到大写人民币,常用的中文大写包括零.壹.贰.叁.肆.伍.陆.柒.捌.玖.拾.佰.仟.万.亿.本文介绍下如何使用JavaScript实现将阿拉伯数字的人民币转换成大写. ...

  6. Java实现人民币大小写转换

    思路和具体方法都在注释中说明 package ClassicArithmetic;import java.util.Scanner;/** @author:LOHAS翀* @time:2019/11/ ...

  7. 人民币大小写格式转换

    using System; using System.Text; using System.Text.RegularExpressions; /// <summary> /// 人民币大小 ...

  8. java人民币大小写转换_人民币大小写转换

    usingSystem;usingSystem.Text;usingSystem.Text.R using System; using System.Text; using System.Text.R ...

  9. 巧用Excel 轻松转换人民币大小写

          巧用Excel 轻松转换人民币大小写 2010-02-08 11:22 要将人民币小写金额转换成大写格式,用Excel提供的格式,将自定义格式类型中的"[dbnum2]G/通用格 ...

最新文章

  1. svg animation应用之-描边效果
  2. Java学习正嗨Day2!
  3. vnc oracle solaris,在Solaris下安装VNC 远程安装Oracle
  4. 前端学习(3280):iterator
  5. flask-前端-requests之response对应关系 json
  6. 小米手机困境,米粉伤心,黄牛伤钱
  7. 转速器盘课程设计 大批量
  8. ue的 linux版本,UltraEdit Linux版RPM包 64位 V16.1.0.22
  9. 【AI视野·今日CV 计算机视觉论文速览 第241期】Wed, 1 Dec 2021
  10. 计算机主机实际功率,PC动力之源,一起来算算电源真实功率吧!
  11. linux 硬盘合并使用方法,Linux硬盘合并的实现代码
  12. OpenCV + CPP 系列(九)颜色空间
  13. Redis持久化(一)-RDB文件的创建和载入
  14. ubuntu命令 图片 壁纸_[教程]Ubuntu下完整配置自动壁纸切换
  15. Word2003入门动画教程25:添加或改变Word页面边框
  16. eclipse 主类中明明有main方法且没有写成mian,还老是提示找不到main方法。
  17. JAVA语言的由来以及相关情况介绍
  18. Ubuntu boot menu
  19. (转)OLAP和多维数据模型
  20. FAT、FAT32和exFAT文件系统

热门文章

  1. 设计模式03:装饰模式
  2. 【Linux学习随笔】三、shell语法-注释
  3. 生源双非占比39.3%,南开软件实力如何?
  4. linux ip地址文件夹,linux设置IP地址
  5. 腾讯助力企业通过等级保护
  6. 让正则表达式允许为空
  7. cool域名是什么意思?cool域名怎么样?
  8. 想做游戏3D建模师,该如何学习,学习哪些方面?
  9. 2022-03-17剑指59-68
  10. python编辑ug update_PyPy3官方版下载-python编辑器 V3.4.2 官方最新版 - 安下载