[算法题] 人民币大小写转换(阿拉伯数字和汉字转换)

简介:

这个算法有几个小的注意点:

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
20140703        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;
}
复制代码

 

结果


本文转自静默虚空博客园博客,原文链接:http://www.cnblogs.com/jingmoxukong/p/3821339.html,如需转载请自行联系原作者

相关文章
|
算法 测试技术 Python
算法分析:阿拉伯数字与罗马数字的互相转换
算法分析:阿拉伯数字与罗马数字的互相转换
145 0
|
算法 iOS开发
iOS 算法之:阿拉伯数字转化为汉语数字
**阿拉伯数字转化为汉语数字** +(NSString *)translation:(NSString *)arebic { NSString *str = arebic; NSArray *arabic_numer...
829 0
|
算法
[算法题] 人民币大小写转换(阿拉伯数字和汉字转换)
在一次面试中遇到一个有意思的小算法题:要求将阿拉伯数字转为汉字显示出来(包含单位)。 当时虽然实现出来,但是代码写的有点凌乱。所以回家后,重新整理了一下。   这个算法有几个小的注意点: 1、中文字符占两个字节,所以如果用C语言实现,需要用char数组的形式保存单个汉字。
1022 0
|
17天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
1天前
|
存储
基于遗传算法的智能天线最佳阵列因子计算matlab仿真
本课题探讨基于遗传算法优化智能天线阵列因子,以提升无线通信系统性能,包括信号质量、干扰抑制及定位精度。通过MATLAB2022a实现的核心程序,展示了遗传算法在寻找最优阵列因子上的应用,显著改善了天线接收功率。
|
3天前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
11天前
|
算法
基于粒子群算法的分布式电源配电网重构优化matlab仿真
本研究利用粒子群算法(PSO)优化分布式电源配电网重构,通过Matlab仿真验证优化效果,对比重构前后的节点电压、网损、负荷均衡度、电压偏离及线路传输功率,并记录开关状态变化。PSO算法通过迭代更新粒子位置寻找最优解,旨在最小化网络损耗并提升供电可靠性。仿真结果显示优化后各项指标均有显著改善。
|
6天前
|
机器学习/深度学习 算法 数据挖掘
基于GWO灰狼优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了基于分组卷积神经网络(GroupCNN)和灰狼优化(GWO)的时间序列回归预测算法。算法运行效果良好,无水印展示。使用Matlab2022a开发,提供完整代码及详细中文注释。GroupCNN通过分组卷积减少计算成本,GWO则优化超参数,提高预测性能。项目包含操作步骤视频,方便用户快速上手。

热门文章

最新文章