【华为OJ】【105-人民币转换】

105 篇文章 155 订阅

【华为OJ】【算法总篇章】


【华为OJ】【105-人民币转换】

【工程下载】


题目描述

考试题目和要点:
1、中文大写金额数字前应标明“人民币”字样。中文大写金额数字应用
壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整等字样填写。(30分)
2、中文大写金额数字到“元”为止的,在“元”之后,应写“整字,
如¥ 532.00应写成“人民币伍佰叁拾贰元整”。在”角“和”分“后面不写”整字。(30分)
3、阿拉伯数字中间有“0”时,中文大写要写“零”字,阿拉伯数字中间连续有几个“0”时,
中文大写金额中间只写一个“零”字,如¥6007.14,应写成“人民币陆仟零柒元壹角肆分“。(

输入描述

输入一个double数

输出描述

输出人民币格式

输入例子

151121.15

输出例子

人民币拾伍万壹仟壹佰贰拾壹元壹角伍分

算法实现

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Author: 王俊超
 * Time: 2016-05-05 19:26
 * CSDN: http://blog.csdn.net/derrantcm
 * Github: https://github.com/Wang-Jun-Chao
 * Declaration: All Rights Reserved !!!
 */
public class Main {
    private final static char[] NUM = {'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾',
            '佰', '仟', '万', '亿'};

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {

            double d = scanner.nextDouble();
            System.out.println(convert(d));
        }

        scanner.close();
    }

    /**
     * 数字转换成人民币
     *
     * @param d 数字
     * @return 人民币字符串
     */
    private static String convert(double d) {
        long n = (long) d;

        StringBuilder builder = new StringBuilder("人民币");

        // 处理整数部分,前提是整数部分大于0
        if (n > 0) {
            convert(n, builder);
            builder.append('元');
        }
        // 加上0.0001是为了防止d*100发生失真
        int v = (int) (d * 100 - n * 100 + 0.0001);
//        System.out.println((d) + " " + (d * 100) + "-" + (n * 100) + "=" + v);

        int i = v / 10;
        int j = v % 10;

        if (i == 0 && j == 0) {
            builder.append('整');

            return builder.toString();
        }

        if (i != 0) {
            builder.append(NUM[i]).append('角');
        }

        if (j != 0) {
            builder.append(NUM[j]).append('分');
        }


        return builder.toString();
    }

    /**
     * 整形数字转换成人民币
     *
     * @param n       整数数字
     * @param builder 保存结果用
     */
    private static void convert(long n, StringBuilder builder) {
        // 大于一亿
        if (n >= 1_0000_0000) {
            long q = n / 1_0000_0000;
            long r = n % 1_0000_0000;

            convert(q, builder);
            builder.append('亿');

            // 是亿的整数倍
            if (r != 0) {
                convert(r, builder);
            }
        }
        // 大于一万
        else if (n >= 1_0000) {
            long q = n / 1_0000;
            long r = n % 1_0000;

            convert(q, builder);
            builder.append('万');

            // 是亿的整数倍
            if (r != 0) {

                if (r < 100) {
                    builder.append('零');
                }

                convert(r, builder);
            }
        }
        // 大于一千
        else if (n >= 1000) {
            long q = n / 1000;
            long r = n % 1000;

            convert(q, builder);
            builder.append('仟');

            // 是亿的整数倍
            if (r != 0) {

                if (r < 100) {
                    builder.append('零');
                }

                convert(r, builder);
            }
        }
        // 大于一百
        else if (n >= 100) {
            long q = n / 100;
            long r = n % 100;

            convert(q, builder);
            builder.append('佰');

            // 是亿的整数倍
            if (r != 0) {

                if (r < 10) {
                    builder.append('零');
                }

                convert(r, builder);
            }
        }
        // 大于十
        else if (n >= 10) {
            long q = n / 10;
            long r = n % 10;

            if (q > 1) {
                convert(q, builder);
            }
            builder.append('拾');

            // 是亿的整数倍
            if (r != 0) {
                convert(r, builder);
            }

        } else {
            builder.append(NUM[(int) n]);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值