`
bardo
  • 浏览: 378262 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
D1407912-ab64-3e76-ae37-b31aa4afa398
浅述PHP设计模式
浏览量:11806
9d6df9f7-91da-3787-a37c-0e826525dd5d
Zend Framewor...
浏览量:10113
85b628bd-a2ed-3de2-a4b1-0d34985ae8b6
PHP的IDE(集成开发环...
浏览量:9501
社区版块
存档分类
最新评论

重发《人民币金额转大写程序 jsp, Java版》

    博客分类:
  • JSP
 
阅读更多
//人民币金额转大写程序 jsp, Java版
//CopyRight Bardo QI
//所以重发这个版本,是因为:http://zhangshangfeng.iteye.com/
//这位老兄没能看懂我前期所发的无注解的,并且未经测试的代码。
//代码原发是在:http://bardo.iteye.com/blog/983559
//其实:写程序只要记住一点:“不要跟着数据走!”那么代码量
//就会增加多少。
//为了能使初学者有所认识,这里对此代码讲解一下:

import java.util.ArrayList;
import java.util.Math.*;
import java.lang.*;
String numToCny(String num){
    //这个变量定义是基于一个基本思想的,那就是,关于汉语数字的读法:
/*********************************************************
汉语的数字读法,有以下口诀:
四位分级,读准位级。
有数读位,个零不读。
多零连续,只读一次。
尾零不读,级不可丢。
本级为零,本级不读。
遇有小数,整零要读。
小数读数,零要分读。
现详细讲解如下:
四位分级,读准位级。 
    如:111111111111 读法:壹仟壹佰壹拾壹亿壹仟壹佰壹拾壹万壹仟壹佰壹拾壹。 即111111111111 分为:1111亿级,1111万级,1111个级,每级都有 仟佰拾个四个位。非零数,读出数与位,到级时,读出级。 
有数读位,个零不读。 
    101 读法:壹佰零壹 而不是:壹佰零拾壹个。即:对于0,只读数,不读位,个位的数,不读位(个字不读)
多零连续,只读一次。 
    1001 读法:壹仟零壹 而不是:壹仟零零壹。即:遇有多个连续的0,只读一次。 
尾零不读,级不可丢。 
    102345 读法:壹拾万贰仟叁佰肆拾伍 而不是:壹拾万零贰仟叁佰肆拾伍 100 读法:壹佰 而不是壹佰零。即按级来分,任一级的尾零都不读。但亿级的亿,万级的万,有尾零时仍要读的
本级为零,本级不读。 
    100002345  读法:壹亿贰仟叁佰肆拾伍圆整 而不是:壹亿零万贰仟叁佰肆拾伍圆整。 即,如果任一级四位全零,那么,不管前后是否有数,都不读。
遇有小数,整零要读。 
    0.23  读法:零点贰叁。即,如果有小数时,整数如果是零,则要读的。
小数读数,零要分读。 
    12.3004 读法:壹拾贰点叁零零肆。 即:小数无位,只是见数读数。 
**********************************************************/
      //为此,这一代码的基本思想就是先对数据进行预处理
    //将期转换成 0000 0000 0000 0000.00 这一形式
    //自然,空格是额外加上的。基本数是12位。所以,最高一级
    //这里用的是“万”来表示的。有人提出用“兆”,但有误解,
    //真要想用,只要能懂即可。		
    String capUnit[] ={"万","亿","万","圆",""};
      //下面这个变量,是这样定义的,每一节都是四位,只有小数是两位。
    //所以,用二维数组,第2项是{"角","分",""},第4项上{"仟","佰","拾",""}
      //这样做,我们可以用当前节的长度获得每一位的单位。这样,就不要用对象了。
    String capDigit[][] = { {""},{""},{"角","分",""},{""},{"仟","佰","拾",""}};
      //以下是数字与汉字对应,无需解释
    String capNum[]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
      //原发是参数是双精度的。但由于操作系统会将其转为科学记数法,所以,现改为字串
    //因为整数最多是16位,所以,超出就不转了
    if (num.indexOf(".") > 16)
        return "ERROR";
      //转成双精度数
    double dnum=Double.parseDouble(num);
      //如果不是数字,不转了。
    if (Double.isNaN(dnum))
        return "ERROR";
      //做保留两位小数的操作
    dnum = Math.round(dnum*100)/100;
      //再转回字符串	
    String snum = Double.toString(dnum);
      //这里是造出一串0,补到原数前面
    double pnum = Math.pow(10,19-snum.length());
      String psnum = Double.toString(pnum);
      //psnum前面有个1,所以,把1去掉,与原数补起来
    //结果就是标准的整数16位,小数两位,中间有点的字串了。
    snum = psnum.substring(1)+snum;
      //由此,我们没花几行代码,对数据进行预处理,所以,后面代码就是完全
    //针对我们预处理好的完全符合我们要求的数据进行编码了,自然代码会很少。
    //定义好要用的变量
    String ret,nodeNum,subret,subChr;
    ArrayList CurChr = new ArrayList(2);
    int i,j=0,k,len;
    //这一循环,是按节循环,但关键是在j=i*4+(int)Math.floor(i/4)
    for (i=0,ret="";i<5;i++,j=i*4+(int)Math.floor(i/4)){
           //每次取出4位,自然,小数点以后的,因为j=i*4+(int)Math.floor(i/4)
	//把小数点跳过去了。并且只能取出两位
        nodeNum=snum.substring(j,j+4);
	//对当前取出的四位进行循环处理,此时处理时,按取出的实际字串的长度循环。这个条件:len=nodeNum.length()
	//同时,如果尾部有零,也不继续,这一条件:(Integer.parseInt(nodeNum.substring(k))!=0)
        for(k=0,subret="",len=nodeNum.length();((k<len) && (Integer.parseInt(nodeNum.substring(k))!=0));k++){
        //为什么要用 CurChr 这个 ArrayList,而且每次访问的都是k%2这一元素?
	//这是要保存上一次的结果,供本次使用
           //capNum[Integer.parseInt(nodeNum.substring(k,k+1))]是把阿拉伯数字对应到汉字
	//而((nodeNum.substring(k,k+1).equals("0"))?"":capDigit[len][k]) 则是对非零的
           //读出对应的位的单位:千,佰,拾,"", 注意,这里有个特别的,是用 len 去读的对
	//应二维数组中的项,所以,如果是两位,自然读出的就是“角”“分”
CurChr.set(k%2,capNum[Integer.parseInt(nodeNum.substring(k,k+1))]+((nodeNum.substring(k,k+1).equals("0"))?"":capDigit[len][k]));
            //这是全部代码中的第三个IF。基本目的,是不让在整数中出现“零零”这样的字样。如果上一次与本次不等。并且,数字前面不为0
            if (!((CurChr.get(0)==CurChr.get(1)) && (CurChr.get(0)==capNum[0])))
                //假如本次不为0,并且,己有非零数字,同时,上一级也有非零数字
		//那么,把当前的“零”字加上来。
                if(!((CurChr.get(k%2) == capNum[0]) && (subret.equals(""))  && (ret.equals(""))))
                    subret += CurChr.get(k%2);
        }
	//如果上一级返回不是“”,在上面的循环结果后面加上级的单位。
        subChr = subret + ((subret.equals(""))?"":capUnit[i]);
            //只要当前结果不是零,或者,全部己得的结果不空,则就将当前结果接上去。
        if(!((subChr == capNum[0]) && (ret.equals(""))))
            ret += subChr;
    }
     //如果最后还是空,返回“零圆”。其实,此代码还有未完善的功能,那就是,无角分的,没有在最后加上“整”字。但这是很容易的。	
    ret=(ret.equals(""))? capNum[0]+capUnit[3]: ret;
    return ret;
}

 

分享到:
评论

相关推荐

    人民币小写金额转大写金额(java版)

    ### 人民币小写金额转大写金额(Java版) #### 概述 本文将详细介绍一个Java程序,该程序用于将小写的人民币金额转换为大写形式。此转换主要用于财务、会计和其他正式场合,在这些场合中,大写金额是标准且必须的...

    java程序实现人民币大写转换

    这是一个把人民币数字转换成大写的java程序

    高效率的人民币金额转大写程序php类.zip

    本文将详细介绍一个关于“高效率的人民币金额转大写程序php类”的知识点,它旨在帮助开发者快速、准确地将数字形式的人民币金额转换为大写的汉字表示。 在财务和会计领域,金额通常需要以大写汉字表示,以防止篡改...

    将数字转为中文金额的大写方式(Java版)

    将数字转为中文金额的大写方式(Java版) 博文链接:https://lovinchan.iteye.com/blog/202768

    数字金额转大写金额(java,jsp)可以直接调用

    /* * 整数部分最多13位 * 调用方法: * 1.新建类 * 2.直接调用getRMB(String num)函数 * 3.返回大写金额 * */

    java 类 金额转换成大写

    Java 类金额转换成大写 在 Java 编程语言中,金额转换成大写是非常有用的功能,特别是在财务、银行、电子商务等领域中。下面我们来详细介绍如何使用 Java 实现金额转换成大写的功能。 实例代码分析 首先,我们来...

    人民币数字转大写.java

    人民币数字转大写.java

    java 金额转大写工具类

    可以把金额数值转为财务上常用的金额大写,如100元 转为壹佰园

    java 正则数字金额转换为大写

    输入字符,通过正则验证是否为金额不超过万亿精确到小数点后两位,然后将数字转换为大写 包括后台java正则验证及前台js验证 请输入一个数字(精确到小数点后两位): fdsa54325.54 fdsa54325.54 false 请输入一个...

    java实现数字转换人民币中文大写工具

    Java 实现数字转换人民币中文大写工具 Java 实现数字转换人民币中文大写工具是指使用 Java 语言将数字转换为人民币中文大写格式的工具。该工具具有很高的实用价值,特别是在人事业务系统开发中,经常需要将数字转换...

    Java人民币金额数字转换成大写

    Java 人民币金额数字转换成大写 Java 人民币金额数字转换成大写是 Java 面试中最常见的问题之一。本文将详细介绍如何使用 Java 实现人民币金额数字转换成大写的解决方案。 Java 中的 NumberFormat 类 在 Java 中...

    JAVA大写金额转化为小写金额

    用JAVA书写的一个大写金额转化为小写金额的类

    FastReport小写金额转大写

    ### FastReport小写金额转大写功能解析 #### 功能概述 在财务文档或正式报告中,将数字金额转换成大写格式是一种常见的规范要求,尤其在中国。FastReport提供了一种方法,通过编写自定义函数来实现这一转换。本例...

    Java数字金额转大写

    将数字金额转换为大写汉字的java工具类,方便财务相关开发转换金额。

    C#小写金额转换大写金额

    C#将小写金额转换成大写,很高兴能与大家分享我的资源

    C语言成序设计__实现人民币小写金额与大写金额的转换

    C语言实现人民币小写金额与大写金额的转换 C语言是一种广泛使用的编程语言,具有强大的功能和灵活性。本文中,我们将使用C语言实现人民币小写金额与大写金额的转换。 在中国,人民币的小写金额与大写金额的转换是...

    金额转大写java工具

    将小写金额转换为大写金额

    java 实现 金额转成中文大写形式

    在Java编程中,将金额的阿拉伯数字转换为中文汉字大写是常见的财务处理需求,主要用于防止数字篡改,增加财务数据的安全性和准确性。这个过程通常称为金额数字化,它涉及到将小数点、整数和小数部分分别转换,并且...

    人民币金额小写转大写

    MFC制作的人民币小写金额转化大写金额,方便出差回来时报账填写账单大写RMB使用,欢迎下载

    人民币小写金额转大写

    标题所提到的“人民币小写金额转大写”在SQL Server中的实现,主要依赖于自定义函数的编写。这段代码示例提供了一个名为`[dbo].[lowertoupper]`的存储过程,它接受一个`decimal(38,4)`类型的参数`@lowermoney`,并...

Global site tag (gtag.js) - Google Analytics