java实战1——浮点数转人民币读法

本文介绍了如何使用Java将浮点数转换为人民币的中文读法。通过将浮点数拆分为整数和小数部分,然后分别处理。整数部分采用四位一读的原则,通过建立汉字库和单位库进行映射。小数部分同样转换为中文读法。文章详细讲解了处理过程,并提供了完整的代码实现。
摘要由CSDN通过智能技术生成
为了学习安卓,现在开始从C++角度来学习Java,现在看到了《疯狂java讲义》的第四章,里面有个字符串转人民币的例子,书上没做完,于是把其补充完善。其中最难的部分就是根据零在不同位置,具有不同行为。按照中文读法,有些零要读出,有些零不需要读出。下面将按照两部分进行讲解,首先举一个例子来说明思路,其次给出Java的源代码供参考,并且进行测试。这个问题主要利用字符串数组来解决。我们假定要转换的浮点数整数部分不超过12位。

(1) 思路


1.1 分割整数和小数部分

       对于一个浮点数,先来看个简单点,不加零。比如12312341234.12。按照中文人民币的读法,四位一读,所以其应该读做“一百二十三亿一千二百三十四万一千二百三十四元一角二分”。首先将浮点数分为两个部分,整数部分(IntPart)和小数(FloatPart)部分。如何分割呢?就是将该浮点数直接强制取整得到整数部分,如: IntPart =(int)12312341234.12=12312341234,然后用原浮点数减去整数部分后再乘以100(因为中文读法最多为角分,为两位),再进行强制转为整数。这样就得到了小数部分。如 12312341234.12-IntPart = 0.12,FloatPart =(int)(0.12*100) = 12。然后分别将小数部分(这时也是个整形)和整形部分在将其变为字符串,然后进行第二步,处理整数部分读法和小数部分读法。

1.2   整数部分转中文字符串

     前面已经将浮点数分割为两个部分了,首先先处理整数部分转中文字符串。将字符串逐一变为汉字,首先要建立一个汉字库(利用数组实现)。可以这样 String[] ChineseArr ={“零”,”一”,”二”…}

      然后通过逐一扫描整数字符串,将其映射到汉字数组中,也就是利用每个数字本身的算术值,进行索引数组,做映射。比如 1.其数字为1,那么就映射到汉字数组中ChineseArr[1]正好就是汉字“一“。然后将其加入到结果字符串中。对于单位的处理,也是利用一个单位数组来进行映射。String[] UnitArr ={“千”,”百”,”十”}。个位不需要单位。如何确保单位的正确匹配呢?这里就要按照整数部分 4位一划分:123 1234 1234。这样就分为3个部分,然后在逐一处理每个部分,每个部分的处理都可以抽象出来,写成一个子函数,这个函数专门用来处理4位数字变成汉字。比如123 1234 1234将其分为3个部分,”123“,”1234“,”1234“,然后分别调用同一个方法后,再进行扫尾处理。

      比如“1234“如何变为汉字串呢?首先逐一扫描字符串,将该字符变为数字,然后映射到汉子数组和单位数组中。

下面为该函数的完整的实现:

  1. public String NumStr2ChineseStr_IntPartCore(String NumStr)  
  2.     {  
  3.         String rst = ""//保存结果 初始化为空  
  4.         int len = NumStr.length(); //获取NumStr的长度  
  5.           
  6.         //补零操作  
  7.         if(len < 4//位数小于4位就前补位  
  8.         {  
  9.             String[] AddZeroStr = { "0","00","000"};  
  10.             NumStr = AddZeroStr[4-len-1] + NumStr;  
  11.         }  
  12.         len = NumStr.length(); //更新长度 其实 len==4  
  13.           
  14.         //扫描至第一个不为0的字符  
  15.         int i=0;   
  16.         while(i < len && NumStr.charAt(i)-'0'==0)  
  17.                     ++i;  
  18.                       
  19.         if(i==len) //四个数都为零 ,就直接输出一个零 并返回  
  20.         {  
  21.             rst += "零";  
  22.             return rst;  
  23.         }  
  24.         //四个数不都为0的情况  
  25.         for(;i < len; ++i)  
  26.         {  
  27.             int num = NumStr.charAt(i) - '0';  
  28.             if( i != len-1 && num != 0)//不是末尾且不为0  
  29.             {  
  30.                 rst += ChineseArr[num] + UnitArr[i] ;//直接映射汉字和单位  
  31.             }  
  32.             else  
  33.             {     
  34.                 //若当前结果字符串中最后一位不是“零”,且数字串最后一位不是数字0 这样对中间2个零的只添加一个“零”如1003  
  35.                 if( rst.length()>0 && rst.charAt(rst.length()-1) != '零' && NumStr.charAt(len-1)-'0'!= 0)  
  36.                 { //四位中第二,三位至少有一个为0且最后一位数字不为0 如1003 则为一千零三  
  37.                     if((i==1||i==2) && num == 0)  
  38.                         rst += "零";  
  39.                 }  
  40.                 if( i== len - 1 && num !=0)//是最后一位,且数字不为0 不加单位  
  41.                 {  
  42.                     rst += ChineseArr[num];  
  43.                 }  
  44.             }  
  45.         }  
  46.             return  rst; //返回结果字符串   
  47.     }  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值