java实现阿拉伯数字转人民币大写(精确到分)

这是一个将阿拉伯数字转人民币大写的工具类, 精确到人民币大写分

package com.client;


import java.math.BigDecimal;

/**
 * Class Description : 该类是把阿拉伯数字转换成中文大写的类。
 * 
 * 
 * 
 * 汉字大写金额数字,一律用正楷字或行书字书写,如壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、圆(元)、
 * 角、分、零、整(正)等易于辨认、不易涂改的字样。
 * 不得用一、二(两)、三、四、五、六、七、八、九、十、念、毛、另(或0)等字样代替,不得任意自造简化字。
 * 
 * 大写金额数字到元或角为止的,在“元”或“角”字之后应写“整”或“正”字;大写金额数字有分的,分字后面不写“整”字。
 * 大写金额数字前未印有人民币字样的,应加填“人民币”三字,“人民币”三字与金额数字之间不得留有空白。
 * 
 * 阿拉伯金额数字中间有“0”时,汉字大写金额要写“零”字,如$101.50,汉字大写金额应写成人民币壹佰零壹圆伍角整。
 * 阿拉伯金额数字中间连续有几个“0”时,汉字大写金额中可以只写一个“零”字,如¥1,004.56,汉字大写金额应写成
 * 人民币壹仟零肆圆伍角陆分。阿拉伯金额数字元位是“0”,或数字中间连续有几个“0”,元位也是“0”,但角位不是“0”时,
 * 汉字大写金额可只写一个“零”字,也可不写“零”字,如$1,320.56,汉字大写金额应写成人民币壹仟叁佰贰拾圆零伍
 * 角陆分,或人民币壹仟叁佰贰拾圆伍角陆分。又如$1,000.56,汉字大写金额应写成人民币壹仟圆零伍角陆分,或人民
 * 币壹仟圆伍角陆分。
 * 
 *                                                      摘自《会计人员工作规则》(84)财会16号
 * 
 * 
 * 
 * 
 */
public class NumberToStringForChineseMoney {

    static String HanDigiStr[] = new String[] { "零", "壹", "贰", "叁", "肆", "伍", "陆",
            "柒", "捌", "玖" };

    static String HanDiviStr[] = new String[] { "", "拾", "佰", "仟", "万", "拾", "佰", "仟",
            "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万",
            "拾", "佰", "仟" };

    /**
     * 负责把小数点前面的数转换为大写中文
     * 
     * 输入字符串必须正整数,只允许前面有空格(必须右对齐),不允许前面有零
     * 
     * @param numberStr
     * @return
     */
    private static String positiveIntegerToHanString(String numberStr) {
        String RMBStr = "";
        boolean lastzero = false;
        boolean hasvalue = false; // 亿、万进位前有数值标记
        int len, n;
        len = numberStr.length();
        if (len > 15)
            return "金额过大!";
        for (int i = len - 1; i >= 0; i--) {
            if (numberStr.charAt(len - i - 1) == ' ')
                continue;
            n = numberStr.charAt(len - i - 1) - '0';
            if (n < 0 || n > 9)
                return "金额含非数字字符!";

            if (n != 0) {
                if (lastzero)
                    RMBStr += HanDigiStr[0]; // 若干零后若跟非零值,只显示一个零
                // 除了亿万前的零不带到后面
                // if( !( n==1 && (i%4)==1 && (lastzero || i==len-1) ) ) //
                // 如十进位前有零也不发壹音用此行
//              if (!(n == 1 && (i % 4) == 1 && i == len - 1)) // 十进位处于第一位不发壹音
                    RMBStr += HanDigiStr[n];
                RMBStr += HanDiviStr[i]; // 非零值后加进位,个位为空
                hasvalue = true; // 置万进位前有值标记

            } else {
                if ((i % 8) == 0 || ((i % 8) == 4 && hasvalue)) // 亿万之间必须有非零值方显示万
                    RMBStr += HanDiviStr[i]; // “亿”或“万”
            }
            if (i % 8 == 0)
                hasvalue = false; // 万进位前有值标记逢亿复位
            lastzero = (n == 0) && (i % 4 != 0);
        }

        if (RMBStr.length() == 0)
            return HanDigiStr[0]; // 输入空字符或"0",返回"零"
        return RMBStr;
    }

    /**
     * 输入double型数转换为大写中文
     * 
     * @param doubleValue
     * @return 大写中文
     */
    public static String getChineseMoneyStringForDoubleVal(double doubleValue) {
        String SignStr = "";
        String TailStr = "";
        long fraction, integer;
        int jiao, fen;

        if (doubleValue < 0) {
            doubleValue = -doubleValue;
            SignStr = "负";
        }
        if (doubleValue > 99999999999999.999
                || doubleValue < -99999999999999.999)
            return "金额数值位数过大!";
        // 四舍五入到分
        long temp = Math.round(doubleValue * 100);
        integer = temp / 100;
        fraction = temp % 100;
        jiao = (int) fraction / 10;
        fen = (int) fraction % 10;
        if (jiao == 0 && fen == 0) {
            TailStr = "整";
        } else {
            TailStr = HanDigiStr[jiao];
            if (jiao != 0)
                TailStr += "角";
            if (integer == 0 && jiao == 0) // 零圆后不写零几分
                TailStr = "";
            if (fen != 0)
                TailStr += HanDigiStr[fen] + "分";
        }

        return (doubleValue>=1)?(SignStr + positiveIntegerToHanString(String.valueOf(integer))
                + "圆" + TailStr):TailStr;
    }

    /**
     * 输入BigDecimal型数转换为大写中文
     * 
     * 精度取决于BigDecimal 的 public double doubleValue() 方法: 是基本收缩转换。 如果此 BigDecimal
     * 的数量太大而不能表示为 double,则将其适当地转换为 Double.NEGATIVE_INFINITY 或
     * Double.POSITIVE_INFINITY。 即使在返回值为有限值的情况下,此转换也可能丢失关于 BigDecimal 值精度的信息。
     * 
     * @param bigDecimalVal
     * @return 大写中文
     */
    public static String getChineseMoneyStringForBigDecimal(BigDecimal bigDecimalVal) {
        return getChineseMoneyStringForDoubleVal(bigDecimalVal
                .doubleValue());
    }

    public static void main(String[] args) {
        System.out.println(getChineseMoneyStringForBigDecimal(new BigDecimal(23432.234)));
    }
}

运行程序,输出结果如下:
贰万叁仟肆佰叁拾贰圆贰角叁分

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java实现数字大写阿拉伯数字的代码: ```java import java.util.HashMap; import java.util.Scanner; public class ChineseNumberToArabic { private static final HashMap<Character, Integer> numberMap = new HashMap<>(); static { numberMap.put('零', 0); numberMap.put('一', 1); numberMap.put('二', 2); numberMap.put('三', 3); numberMap.put('四', 4); numberMap.put('五', 5); numberMap.put('六', 6); numberMap.put('七', 7); numberMap.put('八', 8); numberMap.put('九', 9); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入要换的中文数字:"); String chineseNumber = scanner.next(); int result = 0; // 保存结果 int temp = 0; // 临时变量,保存上一个数字 for (int i = 0; i < chineseNumber.length(); i++) { int number = numberMap.get(chineseNumber.charAt(i)); if (number == 0 && temp == 0) { continue; // 如果当前数字和上一个数字都是 0,跳过 } if (number == 0 && temp != 0) { temp *= 10; // 如果当前数字是 0,上一个数字乘以 10 } else if (number != 0 && temp == 0) { temp = number; // 如果上一个数字是 0,直接赋值 } else if (number != 0 && temp != 0) { if (temp < number) { temp *= number; // 如果当前数字比上一个数字大,上一个数字乘以当前数字 } else { result += temp; temp = number; // 如果当前数字比上一个数字小,将上一个数字加入结果,当前数字赋值给临时变量 } } } result += temp; // 最后将最后一个数字加入结果 System.out.println("换后的阿拉伯数字为:" + result); } } ``` 运行程序,输入要换的中文数字,即可输出对应的阿拉伯数字

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值