文档章节

C语言实现人民币小写转大写

大弹簧
 大弹簧
发布于 2017/09/05 13:49
字数 1091
阅读 11
收藏 0
点赞 0
评论 0

这个是很早之前用C语言实现的人民币小写转大写的方法

/****************************************************************************
 *
 * 函数名称: 
 * 功能描述: 将用阿拉伯数字表示的金额转换为用中文大写数字表示。
 *           金额范围:-9999999999999999.99 —— 9999999999999999.99 
             数量级:  千万亿
             精确值:  小数点后两位 
 * 输入参数: 阿拉伯数字表示的金额
 *                      
 * 输出参数: 中文大写数字表示的金额
 * 返 回 值: 
 *           
 *
 ***************************************************************************
 * Who            Date       Action       Memo
 * ChengCheng			2011-07-20		cc@tkc8.com
 ***************************************************************************
 * TIP: C-Create M-Modify
 ***************************************************************************/
 
/*---------------------------- 头文件定义 ------------------------*/
#include	<stdio.h>
#include	<string.h>
#include	<stdlib.h>
#include	<unistd.h>
/*--------------------------- 头文件定义结束 -------------------------*/

/*------------------------ 以下内容相关函数定义 ------------------------*/

#define	MAX_SMALL_AMOUNT_LEN            19
#define	SMALL_AMOUNT_LEN                MAX_SMALL_AMOUNT_LEN
#define SMALL_PART_LEN                  2
#define	BIG_AMOUNT_LEN                  128
#define	ONE_WORD_LEN                    2
/*------------------------ 以上内容相关函数定义 ------------------------*/


/*
 *去空格
 */ 
void amount_trim ( char *s, char Mode )
{
   int  i ;
   char *p ;

   if ( s == NULL ) 
   {
      return ;
   }
   if ( strlen ( s ) == 0 )  
   {
   	  return ;
   }

   p = s ;

   switch ( toupper ( Mode ) )
   {
      case 'A':

      case 'L':
         while ( *p==' ' || *p== '\t' ) p++ ;
         strcpy ( s , p ) ;
         if(toupper ( Mode )== 'L' ){break ;}

      case 'R':
         while ( ( strlen ( s ) >= 1 ) &&
                 ( ( s [ strlen ( s ) - 1 ] == ' ' ) ||
                   ( s [ strlen ( s ) - 1 ] == '\t' ) ) )
            s [ strlen ( s ) - 1 ] = 0x00 ;
         break ;      
   }
   return ;
} 

/*
 * 检查金额的有效性
 */
int amount_is_valid( char *buffer, int len )
{
   long ll_loop = 0;
   int	li_dots = 0;

   /* --判断输入参数的有效性,如果输入参数不合法,则视为金额无效-- */
   if( buffer == NULL || len <= 0 )
   {
      return( 0 );
   }
   else
   {
      for( ll_loop = 0; ll_loop < len; ll_loop++ )
      {
         if( ll_loop == 0 && buffer[ ll_loop ] == '-' )
         {
            continue;
         }

         if( buffer[ ll_loop ] == '.' )
         {
            li_dots++;
         }

         if(( buffer[ ll_loop ] < '0' || buffer[ ll_loop ] > '9' ) && buffer[ ll_loop ] != '.' )
         {
            return( 0 );
         }
      }
   }

   if( li_dots >= 2 )
   {
      return( 0 );
   }

   return( 1 );
}

/*
 *转换成大写
 */  
char * amount_switch_small_to_big( char *szNum )
{
     
   /* --定义-- */
   static char CapsBuf[ 256 ];
   char buf[ SMALL_AMOUNT_LEN + 1 ];
   char str[ BIG_AMOUNT_LEN + 1 ];
   char power[ ONE_WORD_LEN + 1 ];
   char big[ ONE_WORD_LEN + 1 ];
   int  position;
   int  point_pos;
   int  index;
   int  f_big;
   int  f_power;
   int  is_small_zero;
   int  i;
   
   /* --初始化-- */
   memset(( char * )CapsBuf, 0x00, sizeof( CapsBuf ));
   index = 0;
   position = 0;
   f_big = 0;
   f_power = 0;
   is_small_zero = 0;
   i = 0;
   point_pos = MAX_SMALL_AMOUNT_LEN - SMALL_PART_LEN - 1;
   memset(( char * )CapsBuf, 0x00, sizeof( CapsBuf ));
   memset(( char * )buf, 0x00, sizeof( buf ));
   memset(( char * )str, 0x00, sizeof( str ));
   memset(( char * )power, 0x00, sizeof( power ));
   memset(( char * )big, 0x00, sizeof( big ));

   /* --检查输入参数的有效性-- */
   if( !szNum || !strlen( szNum ))
   {
      return( "ERROR" );
   }
   
   /* --去空格-- */
   amount_trim( szNum, 'A' );
   
   /* --检查金额的有效性-- */
   if( !amount_is_valid( szNum, strlen( szNum )))
   {
      return( "Invalid Amount" );	
   }
   
   /* --判断是否为负数-- */
   if( szNum[ 0 ] == '-') 
   {
      szNum++; 
      strcpy( CapsBuf, "负"	);
   }
   
   /* -- 格式化 -- */ 
   /* ---- 小数部分格式化 ---- */
   /* ------ 找到小数点的位置,如果没有小数点point_pos的值为strlen( buf ) ------ */    
   point_pos = 0;
   while( szNum[ point_pos ] != '.' && ( point_pos < strlen( szNum ) ) ) 
   {
      point_pos++;   	
   }
   if( point_pos == strlen( szNum ))
   {
      strcat( szNum, "." );
   }
   while( strlen( szNum ) - point_pos < SMALL_PART_LEN + 1 )
   {
   	  strcat( szNum, "0" ); 
   } 
   szNum[ point_pos + SMALL_PART_LEN + 1 ] = 0x00;
   /*sprintf( stderr, "小数部分格式化后:%s", ( char * )szNum );*/
   
   /* ---- 整数部分格式化 ----*/    
   /* ------ 去掉小写金额前面可能存在的多余的零 ------ */
   i = 0;   
   while( szNum[ i ] == '0')
   {
      if( i < strlen( szNum ) && szNum[ i + 1 ] != '.')
      {
         szNum++;
      }else
      {
         i++;
      }	
   }   
   /* -- 格式换完毕 --*/
                    
   /* -- 输入长度验证 -- */
   /*
   if( point_pos + SMALL_PART_LEN + 1 < strlen( szNum ) ) 
   {  	
      sprintf( CapsBuf, "小数部分长度超过:%d", SMALL_PART_LEN );
      return( CapsBuf );     
   } 
   */
   if( point_pos + SMALL_PART_LEN + 1 > MAX_SMALL_AMOUNT_LEN ) 
   {  	
      sprintf( CapsBuf, "整数部分长度超过:%d", MAX_SMALL_AMOUNT_LEN - SMALL_PART_LEN - 1 );
      return( CapsBuf );
   } 
   
   if( szNum[0]=='.' )
   {
      buf[0] = '0';	   	
   }            
   strcat( buf, szNum );
          
   /************ 执行转换 *******************/ 
   /* -- 循环处理 -- */
   point_pos = strlen( buf ) - SMALL_PART_LEN - 1;   
   i = 1;
   while( buf[ point_pos + i ] == '0' )
   {
      i++;
   }
   if( i > SMALL_PART_LEN  )
   {
      is_small_zero = 1;
   }
   
   position = 0;            
   index = 0;   
   while( index < strlen( buf ) )
   {
      /* 数值位转换阶段 */
      switch( buf[ index ] )
      {
         case '0':
            sprintf( big, "零" ); 
            f_power = 1;
            f_big = 1; 
            
            /*  解决什么时候显示 "零" */
            if(( index + 1 ) < strlen( buf ))
            {
               if( buf[ index + 1 ] != '0' )
               {
                  f_big = 0;
               }     	  	
            }      	           	                      
            break;
         case '1':
            sprintf( big, "壹" );
            break;
         case '2':
            sprintf( big, "贰" );
            break;
         case '3':
            sprintf( big, "叁" );
            break;
         case '4':
            sprintf( big, "肆" );
            break;
         case '5':
            sprintf( big, "伍" );
            break;
         case '6':
            sprintf( big, "陆" );
            break;
         case '7':
            sprintf( big, "柒" );
            break;
         case '8':
            sprintf( big, "捌" );
            break;
         case '9':
            sprintf( big, "玖" );
            break;
         default:
            f_power = 1;
            f_big = 1; 
            break;
      }        	
            
      /* 权位转换阶段 */          
      switch( point_pos - index )
      {         										         
         case 13:
         case 5:
            sprintf( power, "万" );        	      
            f_power = 0;
            if( buf[ index ] == '0' )
            {
            	f_big = 1;
            }
            if( point_pos > 8 && point_pos - index == 5)
            {
               if( buf[ point_pos - 5 ] == '0' && buf[ point_pos - 6 ] == '0' 
                         && buf[ point_pos - 7 ] == '0' && buf[ point_pos - 8 ] == '0')
               {
                  f_power = 1;
               }
            }
            break;   
         case 16:
         case 12:
         case 8:
         case 4:
            sprintf( power, "仟" );
            break;
         case 15:
         case 11:
         case 7:
         case 3:
            sprintf( power, "佰" );
            break;
         case 14:
         case 10:
         case 6:
         case 2:
            sprintf( power, "拾" );
            break;
         case 9:
            sprintf( power, "亿" );
            f_power = 0;
            if( buf[ index ] == '0' )
            {
               f_big = 1;
            }
            break;
         case 1:
            sprintf( power, "元" );
            if( buf[ index ] == '0' )
            {
            	f_big = 1;
            }
            
            /* 解决什么时候不显示"元" */
            if( position == 0 && f_big == 1 && !is_small_zero )
            {
               f_power = 1;
            }
            else
            {
               f_power = 0;
            }
            
            /* 解决什么时候显示"0" */
            if( position == 0 && f_big == 1 && is_small_zero )
            {
               f_big = 0;
            }                     	         	       	  
            break;
         case 0:
            sprintf( power, "整" );
            f_power = 1;
            if( is_small_zero )
            {
               f_power = 0;
            }  
            break;
         case -1:
            sprintf( power, "角" );
            /* 解决什么时候不显示"0" */
            if( position == 0 && buf[ index ] == '0')
            {
               f_big = 1;
            }
            break;
         case -2:
            sprintf( power, "分" );
            break;
      	 default:
            f_power = 1;
            break;
      } 

      if(!f_big)
      {
         str[ position++ ] = big[ 0 ];
         str[ position++ ] = big[ 1 ];
      }
      if(!f_power)
      {          
         str[ position++ ] = power[ 0 ];
         str[ position++ ] = power[ 1 ];     
      }
      f_big = 0;
      f_power = 0; 
      index++;                    
   } 
   /* 循环处理完毕 */

   str[ position ] = 0x00;
   strcat( CapsBuf, str );
   return( CapsBuf );
}

int main()
{
   char ch[ 50 ];
   fprintf( stderr, "请输入小写金额: " );
   fflush( stdin );
   gets( ch );
   fflush( stdin );
   fprintf( stderr, "转换后大写金额: [%s]\n", ( char * )amount_switch_small_to_big( ch ));
   return( 0 );
}

© 著作权归作者所有

共有 人打赏支持
大弹簧

大弹簧

粉丝 15
博文 11
码字总数 26325
作品 2
golang实现人民币小写转大写

使用golang的正则表达式实现人民币小写转大写,代码如下: 上面代码执行结果如下(可以使用ConvertNumToCny函数输入任何转换金额作为参数): 我们对于大金额的数据经常需要数位数而降低了我...

知止software ⋅ 2016/08/21 ⋅ 0

人民币大小写转换

using System; using System.Text; using System.Text.RegularExpressions; namespace HKH.Common { /// /// 人民币大小写格式转换 /// /// Create By Lwt on 2006/09/23 /// public class c......

晨曦之光 ⋅ 2012/03/09 ⋅ 0

yaf_dispatcher.c 的 yaf_dispatcher_fix_default函数

前言 本小节主要是介绍yafdispatcherfix_default函数的作用以及实现细节。 函数原型 static inline void yafdispatcherfixdefault(yafdispatchert *dispatcher, yafrequest_t *request) 该函......

邪恶的小Y ⋅ 2016/08/26 ⋅ 0

C++ Primer Plus(六)——分支语句和逻辑运算符

将表达式variable==value反转为value==variable,以此来捕获将相等运算符误写为赋值运算符的错误很有效。 一般来说,编写能让编译器能够发现错误的代码,比找出导致难以理解的错误的原因要容...

吃一堑消化不良 ⋅ 2015/11/20 ⋅ 0

CCFLOW如何使用“脚本验证”自动填写表单中的RMB(大写)金额字段

如何使用“脚本验证”自动填写表单中的RMB(大写)金额字段 需求: 表单中有两个字段,一个字段为手工录入的RMB金额(小写),另一个字段需要填写该金额对应的大写形式。 目标: 录入RMB金额...

ccflow ⋅ 2015/07/28 ⋅ 0

PHP Date()函数详细参数

在页面的最前页加上 datedefaulttimezoneset(PRC); /把时间调到北京时间,php5默认为格林威治标准时间/ date () a: "am"或是"pm" A: "AM"或是"PM" d: 几日,两位数字,若不足则补零;从"01"至...

尘世如潮 ⋅ 2016/04/10 ⋅ 1

PHP Date()函数详细参数

在页面的最前页加上 datedefaulttimezoneset(PRC); /把时间调到北京时间,php5默认为格林威治标准时间/ date () a: "am"或是"pm" A: "AM"或是"PM" d: 几日,两位数字,若不足则补零;从"01"至...

尘世如潮 ⋅ 2016/03/19 ⋅ 0

驼峰命名法和下划线风格的互转

偶然遇到这个问题,感觉有些意思,于是研究了一下。 下划线转驼峰比较简单,直接根据下划线打散成数组,每个子项首字符转大写,再做字符串拼接即可。 驼峰转下划线风格,稍微复杂一些。刚开始...

crazymus ⋅ 2015/10/16 ⋅ 0

字符转换

一、题目:编写一个程序,可以一直接收键盘字符,如果是小写字符就输出对应的大写字符,如果接收的是大写字符,就输出对应的小写字符,如果是数字不输出。 二、解题思路: 1、接收键盘字符用g...

qq_38646470 ⋅ 2017/11/07 ⋅ 0

NSString的简单介绍及常用方法总结

1.NSString的介绍 NSString本身是一个字符串类,继承于NSObject,文字内容一般都用NSString来表示。 一个NSString对象就代表一个字符串。 2.NSString的初始化 直接创建字符串: 这是一个常量...

这孤独世界幸好有你丶 ⋅ 2016/09/04 ⋅ 1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 51分钟前 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 今天 ⋅ 7

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部