`
gonglianying
  • 浏览: 198020 次
  • 性别: Icon_minigender_2
  • 来自: xxx
文章分类
社区版块
存档分类
最新评论

金额转换

 
阅读更多
package com.ebb365.beans;
/**
* @(#)SimpleMoneyFormat.java
*
*金额转换,阿拉伯数字的金额转换为中国传统的形式输出
* @lpxuan
* @version 1.00 2008/7/31
*/

import java.text.NumberFormat;
import java.util.HashMap;
import java.lang.StringBuffer;

public class SimpleMoneyFormat {

    public static final String EMPTY="";
    public static final String ZERO="零";
    public static final String ONE="壹";
    public static final String TWO="贰";
    public static final String THREE="叁";
    public static final String FOUR="肆";
    public static final String FIVE="伍";
    public static final String SIX="陆";
    public static final String SEVEN="柒";
    public static final String EIGHT="捌";
    public static final String NINE="玖";
    public static final String TEN="拾";
    public static final String HUNDRED="佰";
    public static final String THOUSAND="仟";
    public static final String TEN_THOUSAND="万";
    public static final String HUNDRED_MILLION="亿";
    public static final String YUAN="元";
    public static final String JIAO="角";
    public static final String FEN="分";
    public static final String DOT=".";
   
    private static SimpleMoneyFormat formatter=null;
    private HashMap chineseNumberMap=new HashMap();
    private HashMap chineseMoenyPattern=new HashMap();
    private NumberFormat numberFormat=NumberFormat.getInstance();
   
    //私有构造函数
    private SimpleMoneyFormat() {
     numberFormat.setMaximumFractionDigits(4);
     numberFormat.setMinimumFractionDigits(2);
     numberFormat.setGroupingUsed(false);
    
     chineseNumberMap.put("0",ZERO);
     chineseNumberMap.put("1",ONE);
     chineseNumberMap.put("2",TWO);
     chineseNumberMap.put("3",THREE);
     chineseNumberMap.put("4",FOUR);
     chineseNumberMap.put("5",FIVE);
     chineseNumberMap.put("6",SIX);
     chineseNumberMap.put("7",SEVEN);
     chineseNumberMap.put("8",EIGHT);
     chineseNumberMap.put("9",NINE);
     chineseNumberMap.put(DOT,DOT);
    
     chineseMoenyPattern.put("1",TEN);
     chineseMoenyPattern.put("2",HUNDRED);
     chineseMoenyPattern.put("3",THOUSAND);
     chineseMoenyPattern.put("4",TEN_THOUSAND);
     chineseMoenyPattern.put("5",TEN);
     chineseMoenyPattern.put("6",HUNDRED);
     chineseMoenyPattern.put("7",THOUSAND);
     chineseMoenyPattern.put("8",HUNDRED_MILLION);
    }
   
    //单例模式
    public static SimpleMoneyFormat getInstance(){
     if(formatter==null)
      formatter=new SimpleMoneyFormat();
     return formatter;
    }
   
    public String format(String moneyStr){
     checkPrecision(moneyStr);
     String result;
     result=convertToChineseNumber(moneyStr);
     result=addUnitsToChineseMoenyString(result);
     return result;
    }
   
    public String format(double moneyDouble){
     return format(numberFormat.format(moneyDouble));
    }
   
    public String format(int moneyInt){
     return format(numberFormat.format(moneyInt));
    }
   
    public String format(long moneyLong){
     return format(numberFormat.format(moneyLong));
    }
   
    public String format(Number moneyNum){
     return format(numberFormat.format(moneyNum));
    }
   
    private String convertToChineseNumber(String moneyStr){
     String result;
     StringBuffer cMoneyStringBuffer =new StringBuffer();
     for(int i=0;i<moneyStr.length();i++){
      cMoneyStringBuffer.append(chineseNumberMap.
       get(moneyStr.substring(i,i+1)));
     }
    
     int indexOfDot=cMoneyStringBuffer.indexOf(DOT);
     int moneyPatternCursor=1;
     for(int i=indexOfDot-1;i>0;i--){
      cMoneyStringBuffer.insert(i,
          chineseMoenyPattern.get(EMPTY+moneyPatternCursor));
      moneyPatternCursor=moneyPatternCursor==8?1:moneyPatternCursor+1;
     }
    
     String fractionPart=cMoneyStringBuffer.substring(
      cMoneyStringBuffer.indexOf("."));
        cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("."),cMoneyStringBuffer.length());
        while(cMoneyStringBuffer.indexOf("零拾")!=-1){
         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零拾"),cMoneyStringBuffer.indexOf("零拾")+2,ZERO);
        }
        while(cMoneyStringBuffer.indexOf("零佰")!=-1){
         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零佰"),cMoneyStringBuffer.indexOf("零佰")+2,ZERO);
        }
        while(cMoneyStringBuffer.indexOf("零仟")!=-1){
         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零仟"),cMoneyStringBuffer.indexOf("零仟")+2,ZERO);
        }
        while(cMoneyStringBuffer.indexOf("零万")!=-1){
         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零万"),cMoneyStringBuffer.indexOf("零万")+2,TEN_THOUSAND);
        }
        while(cMoneyStringBuffer.indexOf("零亿")!=-1){
         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零亿"),cMoneyStringBuffer.indexOf("零亿")+2,HUNDRED_MILLION);
        }
        while(cMoneyStringBuffer.indexOf("零零")!=-1){
         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零零"),cMoneyStringBuffer.indexOf("零零")+2,ZERO);
        }
        if(cMoneyStringBuffer.lastIndexOf(ZERO)==cMoneyStringBuffer.length()-1){
         cMoneyStringBuffer.delete(cMoneyStringBuffer.length()-1,cMoneyStringBuffer.length());
        }
        cMoneyStringBuffer.append(fractionPart);
        result=cMoneyStringBuffer.toString();
        return result;
    }
   
    private String addUnitsToChineseMoenyString(String moneyStr){
     String result;
     StringBuffer cMoneyStringBuffer=new StringBuffer(moneyStr);
    
     int indexOfDot=cMoneyStringBuffer.indexOf(DOT);
     cMoneyStringBuffer.replace(indexOfDot,indexOfDot+1,YUAN);
     cMoneyStringBuffer.insert(cMoneyStringBuffer.length()-1,JIAO);
     cMoneyStringBuffer.insert(cMoneyStringBuffer.length(),FEN);
    
      //拾佰仟万亿等都是汉字里面才有的单位,加上它们
     if(cMoneyStringBuffer.indexOf("零角零分")!=-1)//去掉零头,加整
      cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零角零分"),cMoneyStringBuffer.length(),"整");
     else if(cMoneyStringBuffer.indexOf("零分")!=-1)//去掉零分,加整
         cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf("零分"),
cMoneyStringBuffer.length(),"整");
     else if(cMoneyStringBuffer.indexOf("零角")!=-1)
      cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf("零角"),
           cMoneyStringBuffer.indexOf("零角")+2);
         result=cMoneyStringBuffer.toString();
         return result;
    }
   
    //检查精度的合法性
    private void checkPrecision(String moneyStr){
     int fractionDigits=moneyStr.length()-moneyStr.indexOf(DOT)-1;
     if(fractionDigits>2)//精度不能比分低
      throw new RuntimeException("金额"+moneyStr+"的小数位数多余两位.");
    }
   
    public static void main(String[] args){
     System.out.println(getInstance().format(new Double(10010001.01)));
    }
   
}
分享到:
评论

相关推荐

    VB编写的金额转换例子

    在VB(Visual Basic)编程中,金额转换是一个常见的需求,特别是在财务软件或会计系统中。这个例子展示了如何将数字格式的金额转换为汉字大写,以便于财务报表和支票等正式文档的清晰表述。汉字大写金额转换是避免...

    将数字金额转换为中文大写金额

    将数字金额转换为中文大写金额将数字金额转换为中文大写金额将数字金额转换为中文大写金额

    C# - 阿拉伯数字金额转换为繁体数字金额

    这个特定的项目“C# - 阿拉伯数字金额转换为繁体数字金额”专注于一个常见的财务处理任务,即把通常用阿拉伯数字表示的货币金额转化为繁体中文的表示方式。这在中文环境中特别有用,因为繁体数字在正式的商业文档和...

    大写金额转换器

    【大写金额转换器】是一种实用工具,专为金融、会计和商业领域的用户设计,能够将数字金额转换成中文大写形式。在处理财务文件、合同或者发票时,按照中国的传统,金额通常需要以中文大写来表示,以增强文档的清晰度...

    Asp.net C# 数字货币金额转换为中英文金额写法

    在Asp.net C#开发中,经常需要处理与货币相关的数据,这包括将数字金额转换成规范的中英文表示方式,以满足财务报告、发票或合同等场景的需求。本资源提供的程序实现了一种高效的方法来完成这个任务。下面将详细阐述...

    java 类 金额转换成大写

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

    小写金额转换为大写金额

    在金融和会计领域,金额通常会以两种形式存在:小写和大写。小写金额是常规的数字表示,如123456....通过理解并遵循这些规则,我们可以编写出能够准确将小写金额转换为大写金额的程序,确保财务数据的准确性和规范性。

    将金额转换成大写金额 封装类 及 例子

    在IT行业中,尤其是在财务软件开发或者银行系统的编程中,经常需要将数字金额转换为中文大写的表示形式,以便于财务报告、单据打印等场景。本文将深入探讨如何使用C#语言来封装一个类,实现将金额转换为大写金额的...

    winform C#人民币大小写金额转换程序

    本项目"winform C#人民币大小写金额转换程序"是一个实用工具,旨在帮助用户将输入的数字金额自动转换为规范的中文大写,这在财务报表、发票和合同中非常常见,因为中文大写可以避免因数字篡改而引发的争议。...

    自编自用的一个支持三种转换形式的金额转换大写函数access2000

    标题中的“自编自用的一个支持三种转换形式的金额转换大写函数access2000”指的是一个在Access 2000环境下开发的自定义函数,它具有将数字金额转换为大写汉字的能力,这在财务软件或者需要打印正式单据的应用中非常...

    javascript数字金额转换为中文大写金额

    ### JavaScript 数字金额转换为中文大写金额 在日常财务处理、银行交易或是发票开具等场景中,将数字金额转换成中文大写金额是一项常见的需求。这种转换不仅可以提高正式文档的专业性,还能避免因数字易被篡改而...

    将金额转换成中文的c代码

    本主题聚焦于一个特定的编程任务:将金额转换成中文表示。这在财务软件、报表系统或任何需要以中文格式展示金额的应用中非常有用。下面我们将详细探讨这个过程涉及的编程知识点。 首先,我们需要理解金额的中文表示...

    将阿拉伯数字金额转换为中国传统形式人民币值

    自己写的将阿拉伯数字金额转换为中国传统形式人民币值的小程序,亲测可用!

    c语言小程序(人民币小写金额转换成大写金额)

    在C语言编程中,开发一个小程序来将人民币的小写金额转换为大写金额是一项常见的任务,尤其在财务软件或银行系统中。这个程序的核心在于理解人民币金额的表示规则,并将其与C语言的数据处理和字符串操作相结合。下面...

    银行金额转换

    根据给定的文件信息,我们可以总结出以下关于“银行金额转换”的相关知识点,主要聚焦于Java编程语言在处理银行金额转换中的应用。 ### 银行金额转换:Java实现细节 #### 核心功能与算法设计 在Java中实现银行金额...

    C语言 金额转换大写

    在日常工作中,我们经常需要将数字金额转换成汉字大写形式,特别是在财务系统、银行系统或发票处理等场景中。本篇文章将详细解析一个C语言编写的函数`LowMoneyToUpper`,该函数能够将小写金额转换为大写形式,并且...

    用JS将人民币金额转换成大写

    在IT行业中,尤其是在前端开发领域,经常需要处理与用户交互的数据,其中涉及到金额展示时,为了规范和清晰,我们通常会将人民币金额转换为大写形式。这是因为在中国,正式的财务收据和合同中,金额通常以大写汉字...

    使用java将人民币金额转换成大写并使用自定义标签显示到页面

    本篇将介绍如何使用Java编程语言将人民币金额转换成大写,并且通过自定义标签库(Tag Library)在网页上显示。首先,我们来看`ChangeNumMoney.java`这个文件,它可能包含了实现金额转换的核心逻辑。 `...

    大小写金额转换

    在IT领域,尤其是在编程与财务应用的交叉领域中,“大小写金额转换”是一个常见的需求,尤其是在处理财务报表、发票或银行交易时。该功能的主要目的是将数字表示的金额转换为中文大写形式,以符合中国会计和金融领域...

    报账金额转换器

    【报账金额转换器】是一款专为日常工作中的财务报账环节设计的小型应用程序,它简化了报销金额的转换过程,极大地提高了工作效率。在财务工作中,尤其是报销操作时,经常需要在不同格式或单位之间转换金额,例如从元...

Global site tag (gtag.js) - Google Analytics