`
ganglong99
  • 浏览: 162035 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

金额转换——阿拉伯数字的金额转换成中国传统的形式

 
阅读更多
package com.test.coding.theme;

import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Map;

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 NumberFormat numberFormat = NumberFormat.getInstance();

    private Map<String, String> chineseMap = new HashMap<String, String>();

    private Map<Integer, String> unitMap = new HashMap<Integer, String>();

    public SimpleMoneyFormat() {
        numberFormat.setGroupingUsed(false); // 不使用逗号分隔如 100,100,1

        chineseMap.put("0", ZERO);
        chineseMap.put("1", ONE);
        chineseMap.put("2", TWO);
        chineseMap.put("3", THREE);
        chineseMap.put("4", FOUR);
        chineseMap.put("5", FIVE);
        chineseMap.put("6", SIX);
        chineseMap.put("7", SEVEN);
        chineseMap.put("8", EIGHT);
        chineseMap.put("9", NINE);
        chineseMap.put(DOT, DOT);

        unitMap.put(1, TEN);
        unitMap.put(2, HUNDRED);
        unitMap.put(3, THOUSAND);
        unitMap.put(4, TEN_THOUSAND);
        unitMap.put(5, TEN);
        unitMap.put(6, HUNDRED);
        unitMap.put(7, THOUSAND);
        unitMap.put(8, HUNDRED_MILLION);
    }

    public static SimpleMoneyFormat getInstance() {
        if (null == formatter) {
            formatter = new SimpleMoneyFormat();
        }
        return formatter;
    }

    public String convertToChinese(String moneyStr) {
        StringBuffer sb = new StringBuffer(EMPTY);
        for (int i = 0; i < moneyStr.length(); i++) {
            sb.append(chineseMap.get(moneyStr.substring(i, i + 1)));
        }
        int indexOfDot = sb.indexOf(DOT);
        int length = indexOfDot != -1 ? indexOfDot - 1 : sb.length() - 1;
        int cursor = 1;
        for (int i = length; i > 0; i--) {
            sb.insert(i, unitMap.get(cursor));
            if (cursor == 8) {
                cursor = 1;
            } else {
                cursor = cursor + 1;
            }
        }
        String dotPart = EMPTY;
        if (sb.indexOf(DOT) != -1) {
            dotPart = sb.substring(sb.indexOf(DOT));
            sb.delete(sb.indexOf(DOT), sb.length());
        }
        while (sb.indexOf("零拾") != -1) {
            sb.replace(sb.indexOf("零拾"), sb.indexOf("零拾") + 2, ZERO);
        }
        while (sb.indexOf("零佰") != -1) {
            sb.replace(sb.indexOf("零佰"), sb.indexOf("零佰") + 2, ZERO);
        }
        while (sb.indexOf("零仟") != -1) {
            sb.replace(sb.indexOf("零仟"), sb.indexOf("零仟") + 2, ZERO);
        }
        while (sb.indexOf("零万") != -1) {
            sb.replace(sb.indexOf("零万"), sb.indexOf("零万") + 2, TEN_THOUSAND);
        }
        while (sb.indexOf("零亿") != -1) {
            sb.replace(sb.indexOf("零亿"), sb.indexOf("零亿") + 2, HUNDRED_MILLION);
        }
        while (sb.indexOf("零零") != -1) {
            sb.replace(sb.indexOf("零零"), sb.indexOf("零零") + 2, ZERO);
        }
        if (sb.lastIndexOf(ZERO) == sb.length() - 1) {
            sb.delete(sb.length() - 1, sb.length());
        }
        
        if (EMPTY.equals(dotPart) || DOT.equals(dotPart)) {
            dotPart = DOT + ZERO + ZERO;
        } else if (dotPart.length() == 2) {
            dotPart = dotPart + ZERO;
        } else if (dotPart.length() > 3) {
            dotPart = dotPart.substring(0, 3); // 只取小数点后前两位
        }
        sb.append(dotPart);
        return sb.toString();
    }

    public String addUnit(String str) {
        StringBuffer sb = new StringBuffer(str);
        int indexOfDot = sb.indexOf(DOT);
        if (indexOfDot != -1) {
            sb.replace(indexOfDot, indexOfDot + 1, YUAN);
            sb.insert(sb.length() - 1, JIAO);
            sb.insert(sb.length(), FEN);
        } else {
            sb.append(YUAN);
        }
        while (sb.indexOf("零角") != -1) {
            sb.replace(sb.indexOf("零角"), sb.indexOf("零角") + 2, EMPTY);
        }
        while (sb.indexOf("零分") != -1) {
            sb.replace(sb.indexOf("零分"), sb.indexOf("零分") + 2, EMPTY);
        }
        return sb.toString();
    }

    public String format(String money) {
        String result = convertToChinese(money);
        result = addUnit(result);
        return result;
    }
    
    public String format(double d) {
        return format(numberFormat.format(d));
    }
    
    public String format(int i) {
        return format(numberFormat.format(i));
    }
    
    public String format(long l) {
        return format(numberFormat.format(l));
    }
    
    public String format(Number number) {
        return format(numberFormat.format(number));
    }

    public static void main(String[] args) {
        SimpleMoneyFormat format = SimpleMoneyFormat.getInstance();
        System.out.println(format.format(new Double(2300000044324.02)));
    }
}

 

输出结果为:

贰万叁仟亿零肆万肆仟叁佰贰拾肆元贰分

分享到:
评论

相关推荐

    16进制数据与浮点型数据转换——c语言程序

    16进制(Hexadecimal)是一种逢16进1的数制,它使用0到9的阿拉伯数字和A到F的字母(代表10到15)来表示数值。在计算机科学中,16进制常用于表示内存地址、颜色代码或二进制数据的简洁形式。 2. **浮点型数据**: ...

    ArabicNumberToWord:一个免费的跨平台工具(使用QtC ++)将数字和金额从数字转换为阿拉伯语单词

    在编程中,将阿拉伯数字转换为对应的阿拉伯文单词是一项实用的功能,尤其对于财务软件或者教育应用来说更为重要。本文将详细介绍一个基于Qt/C++的开源项目——ArabicNumberToWord,这是一个专门用于将数字和金额转换...

    DVB——16进制转换2进制

    1. **十六进制**:是一种基于16为基数的进位制数系,由0~9的阿拉伯数字和A~F的大写字母组成。其中A代表10、B代表11、C代表12、D代表13、E代表14、F代表15。 2. **二进制**:是最简单的进位制之一,只有两个符号“0”...

    num-to-rmb-tool:一种用于将阿拉伯数字转换为中文数字的中文金融工具

    《中文金融工具:num-to-rmb-tool——阿拉伯数字与中文数字转换详解》 在金融行业中,精确、清晰地表达数字尤为重要,特别是在涉及货币时。中国的金融领域尤其偏好使用中文数字来表示金额,以避免混淆和确保准确性...

    MFC基于对话框的阿拉伯数字识别

    在本项目中,我们主要探讨的是一个基于MFC(Microsoft Foundation Classes)的对话框应用程序,其功能是实现阿拉伯数字的图像处理与识别。MFC是一个C++类库,由微软开发,用于简化Windows应用程序的开发。它提供了...

    进制转换 ppt.zip

    它使用0-9的阿拉伯数字和A-F的字母(A代表10,B代表11,C代表12,D代表13,E代表14,F代表15)。例如,二进制数10110101可以转换为十六进制的B5。 **五、进制转换的方法** 1. **二进制转十进制**:通过将每个二...

    16进制显示转换二进制.vi_16进制转化二进制_

    这些符号包括0-9的阿拉伯数字和A-F的字母,分别代表10-15。16进制常用于简化二进制表示,因为一个16进制数字可以表示4位二进制数。例如,16进制的'10'等同于二进制的'1000',而16进制的'A'等于二进制的'1010'。 二...

    python123作业——08字符串

    - 中文数字转换:将中文数字(壹、贰、叁...)转换成阿拉伯数字,涉及汉字字符的处理和映射关系。 9. **20字符串加密.py**: - 字符串加密:可能使用了简单的加密算法,如Caesar密码(移位加密)或者更复杂的加密...

    进制转换器

    4. **十六进制(Hexadecimal)**:十六进制系统使用0到9的阿拉伯数字和A到F的字母(代表10到15),总共十六个符号。在计算机科学中,十六进制常用于内存地址、颜色代码和程序调试,因为它能更紧凑地表示二进制数,且...

    顺序栈、链栈将10进制转为2、8、16进制源码

    本话题聚焦于一种特定的应用——使用C++实现的顺序栈和链栈,将10进制数转换为2、8、16进制。这里我们将深入探讨顺序栈和链栈的概念,以及它们如何应用于不同进制之间的转换。 首先,顺序栈是一种基于数组的数据...

    Exce百宝箱——2012版本.rar

    函数功能与参数:与“大写”函数相反,将大写字符转换为阿拉伯数字。 函数名称:分割取数 函数功能与参数:按分割符取数。第一参数为单元格,第二参数表示取第N个,第三个参数表示分割符。 函数名称:共有项 函数...

    常用SQL处理语句\最新数字转大写SQL函数

    本文将深入探讨“常用SQL处理语句”中的一个特定知识点——“最新数字转大写SQL函数”,这一功能在财务系统、银行应用以及任何需要将数值金额转换为大写形式显示的场景中尤为关键。 ### 数字转大写的功能意义 数字...

    fudian_16浮点与十六进制转换

    在十六进制中,有16个符号,包括0-9的阿拉伯数字和A-F的字母,分别代表十进制中的0-15。在编程和计算机硬件领域,十六进制常被用来表示内存地址、颜色值等。 浮点数与十六进制之间的转换是程序员必须掌握的基本技能...

    Laravel开发-laravel-number-converter

    `laravel-number-converter` 提供了这样的功能,能够方便地将阿拉伯数字转换为汉字表示。这对于展示中文内容或处理中文数据时非常有帮助,比如在生成报表或用户界面时。 2. **罗马数字转换**: 罗马数字是一种古老...

    js代码-项目实战:罗马数字转换器

    这个工具能够将阿拉伯数字转换成罗马数字,或者将罗马数字转换为阿拉伯数字。这涉及到对JavaScript语言的理解,以及对罗马数字系统的基本规则的掌握。 首先,让我们了解一下罗马数字。罗马数字是一种古老的数字表示...

    JS案例分享之金额小写转大写

    本文将详细介绍一个具体的JavaScript函数实现——将小写金额数字转换为中文大写形式,并对其中涉及的关键技术和实现细节进行深入剖析。 #### 函数概述 函数名称:`Arabia_to_Chinese` **功能描述**: 该函数接收...

    2021CCPC威海热身赛_Problem C. Count(csdn)————程序.pdf

    3. 将Zayin在第x秒要写的数字转换为这个自定义计数系统的数字。 4. 计算出Taotao在相同秒数下会写的数字,这可以通过简单地移除Taotao无法识别的数字的位来实现。 例如,如果Zayin在第20秒写10(在十进制中),那么...

    编译语言-简单的单词识别程序[定义].pdf

    该程序的核心任务是从文本文件中读取一串字符,将字符流中的单词逐一提取,并判断这些单词是否为预设的英文数字(如zero到nine),如果是,则将其转换为对应的阿拉伯数字。 程序代码中,`DistinguishWord.java`是一...

    新北师大版小学四年级上册数学第1单元《认识更大的数——人口普查》同步检测1(无答案).pdf

    - 将中文数字转换成阿拉伯数字,如“三百零七万八千四百”写作3078400;“九十万二千零六十”写作902060;“六亿八千四百三十万九千”写作684309000;“四十三亿零九十六万”写作4300960000。 4. 数字的组合与读法...

Global site tag (gtag.js) - Google Analytics