`

Java数字小写转换为大写

阅读更多
闲来无事,在网上搜索了一些面试的题目,开始练习下,下列代码的作用是把数字转换为大写的,主要是人民币的写法,暂时没有考虑小数位。
package com.fit.test01;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DigitalLowerToUpper {

	private static final Map<String, String> digitDict = new HashMap<String, String>();

	static {

		digitDict.put("0", "零");
		digitDict.put("1", "壹");
		digitDict.put("2", "贰");
		digitDict.put("3", "叁");
		digitDict.put("4", "肆");
		digitDict.put("5", "伍");
		digitDict.put("6", "陆");
		digitDict.put("7", "柒");
		digitDict.put("8", "捌");
		digitDict.put("9", "玖");
		digitDict.put("10", "拾");
	}

	/**
	 * 转换
	 * 
	 * @param obj
	 * @return
	 */
	public static String upper(String obj) {

		if (obj.length() > 17) {
			return "Can not process it!";
		}

		if (obj.length() <= 17 && obj.length() > 16) {
			StringBuffer sb = new StringBuffer();

			BigDecimal db10000 = new BigDecimal("10000000000000000");

			BigDecimal bd = new BigDecimal(obj);

			BigDecimal yushu = bd.remainder(db10000);

			BigDecimal shang = bd.divideToIntegralValue(db10000);

			if (yushu.toString().equals("0")) {
				return sb.append(getYuanzi(shang.toString())).append("亿")
						.append("亿").toString();
			}

			if (yushu.toString().length() < 12) {
				return sb.append(getYuanzi(shang.toString())).append("亿")
						.append("亿").append(upper(yushu.toString())).toString();
			}

			return sb.append(getYuanzi(shang.toString())).append("亿")
					.append(upper(yushu.toString())).toString();
		}

		if (obj.length() <= 16 && obj.length() > 12) {
			StringBuffer sb = new StringBuffer();

			BigDecimal db10000 = new BigDecimal("1000000000000");

			BigDecimal bd = new BigDecimal(obj);

			BigDecimal yushu = bd.remainder(db10000);

			BigDecimal shang = bd.divideToIntegralValue(db10000);

			if (yushu.toString().equals("0")) {
				return sb.append(getYuanzi(shang.toString())).append("万")
						.append("亿").toString();
			}

			if (yushu.toString().length() < 8) {
				return sb.append(getYuanzi(shang.toString())).append("万")
						.append("亿").append(upper(yushu.toString())).toString();
			}

			return sb.append(getYuanzi(shang.toString())).append("万")
					.append(upper(yushu.toString())).toString();
		}

		if (obj.length() <= 12 && obj.length() > 8) {
			StringBuffer sb = new StringBuffer();

			BigDecimal db10000 = new BigDecimal("100000000");

			BigDecimal bd = new BigDecimal(obj);

			BigDecimal yushu = bd.remainder(db10000);

			BigDecimal shang = bd.divideToIntegralValue(db10000);

			if (yushu.toString().length() == 1 && !yushu.toString().equals("0")) {
				return sb.append(getYuanzi(shang.toString())).append("亿")
						.append("零").append(upper(yushu.toString())).toString();
			}

			return sb.append(getYuanzi(shang.toString())).append("亿")
					.append(upper(yushu.toString())).toString();
		}

		if (obj.length() <= 8 && obj.length() > 4) {
			StringBuffer sb = new StringBuffer();

			BigDecimal db10000 = new BigDecimal("10000");

			BigDecimal bd = new BigDecimal(obj);

			BigDecimal yushu = bd.remainder(db10000);

			BigDecimal shang = bd.divideToIntegralValue(db10000);

			if (yushu.toString().length() == 1 && !yushu.toString().equals("0")) {
				return sb.append(getYuanzi(shang.toString())).append("万")
						.append("零").append(upper(yushu.toString())).toString();
			}

			return sb.append(getYuanzi(shang.toString())).append("万")
					.append(upper(yushu.toString())).toString();
		}

		if (obj.length() <= 4) {
			StringBuffer sb = new StringBuffer();

			return sb.append(getYuanzi(obj)).toString();
		}

		String result = "";

		return result;
	}

	/**
	 * 格式化字符串中的零
	 * 
	 * @param obj
	 * @return
	 */
	public static String format(String obj) {

		if (!obj.startsWith("0")) {
			return obj;
		}

		Pattern p = Pattern.compile("^0*");
		Matcher m = p.matcher(obj);

		String result = null;

		if (m.find()) {
			result = obj.substring(m.start() + 1);
			m.replaceFirst("");
		}

		if (result.startsWith("0")) {
			return format(result);
		}

		return result;
	}

	/**
	 * 递归调用的原子方法,以万位进位
	 * 
	 * @param obj
	 * @return
	 */
	public static String getYuanzi(String obj) {

		String format = format(obj);

		StringBuffer sb = new StringBuffer();

		if (format.length() == 0) {
			return sb.toString();
		}

		if (obj.equals("0") && obj.length() == 1) {
			return sb.toString();
		}

		if (format.length() != obj.length()) {
			sb.append("零");
		}

		if (format.length() == 4) {
			String qian = format.substring(0, 1);
			String shengxia = format.substring(1);
			return sb.append(digitDict.get(qian)).append("千")
					.append(getYuanzi(shengxia)).toString();
		}

		if (format.length() == 3) {
			String qian = format.substring(0, 1);
			String shengxia = format.substring(1);
			return sb.append(digitDict.get(qian)).append("佰")
					.append(getYuanzi(shengxia)).toString();
		}

		if (format.length() == 2) {
			String qian = format.substring(0, 1);
			String shengxia = format.substring(1);
			return sb.append(digitDict.get(qian)).append("拾")
					.append(getYuanzi(shengxia)).toString();
		}

		if (format.length() == 1) {
			String qian = format.substring(0, 1);
			if (qian.equals("0")) {
				return sb.toString();
			}
			String shengxia = format.substring(1);
			return sb.append(digitDict.get(qian)).append(getYuanzi(shengxia))
					.toString();
		}

		return sb.toString();
	}

	public static void main(String[] args) {

		// System.out.println(upper("45678123410000010"));
		// System.out.println(upper("40000100000100001"));
		//System.out.println(upper("40000000000000000"));
		//System.out.println(upper("4000000000000"));
		System.out.println(upper("4000000000001"));
		System.out.println(upper("4000001000101"));
		//System.out.println(upper("400000000"));
		//System.out.println(upper("400000001"));
		//System.out.println(upper("400010001"));
		//System.out.println(upper("411110001"));
		//System.out.println(upper("40000"));
		//System.out.println(upper("40001"));
		//System.out.println(upper("40101"));

	}
}


本人在main方法中列举出了一些测试例子,目前为止还么发现问题,哪位高手如果发现了,欢迎大家给我指出来,谢谢。另外,次方法只支持17位一下的转换。
分享到:
评论

相关推荐

    java钱币小写转换大写

    在Java编程中,将钱币小写金额转换为大写金额是一项常见的需求,特别是在财务系统或者电商平台上,为了符合规范和避免误解,金额通常会以大写形式展示。本知识点主要探讨如何利用Java实现这一功能。 首先,我们需要...

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

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

    Java编程-金额小写转大写

    在Java编程中,将金额小写转换为大写是一个常见的需求,特别是在财务系统或银行应用中,为了符合规范,金额通常需要以大写形式展示,防止因大小写混淆导致的错误。本文将深入探讨如何实现这个功能,并通过提供的`...

    小写数字转换大写数字

    小写数字转换为大写数字的过程涉及到一系列的映射规则。例如,阿拉伯数字1到9分别对应汉字的一、二、三、四、五、六、七、八、九;数字0对应零;而个位、十位、百位、千位、万位等的表示则有专门的汉字对应,如“壹...

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

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

    java将数字转换成大写字母

    在Java编程语言中,将数字转换为大写字母涉及到字符编码和字符串操作。这个过程通常用于格式化输出,比如在创建验证码、显示特定格式的序列号或者处理与数字相关的特殊需求时。以下是一些关键的知识点,解释了如何在...

    人民币数字转换成汉字大写

    人民币数字转换成汉字大写 android Java 运行效率

    Java方法小写转换大写人民币

    根据给定的文件信息,我们可以总结出以下有关“Java方法小写转换大写人民币”的相关知识点: ### 一、背景介绍 在财务处理、银行系统等业务场景中,经常需要将数字金额转换为中文大写形式,特别是对于精确度较高的...

    java金钱大写转小写数字类(精确到角)

    精确到0.1

    金钱大写转小写数字类java(精确到角)

    本节将详细探讨如何用Java编程语言实现一个精确到角的中文大写转小写数字的程序。 首先,我们需要了解中文大写数字与阿拉伯数字的对应关系: 1. 零:零 2. 一:壹 3. 二:贰 4. 三:叁 5. 四:肆 6. 五:伍 7. 六:...

    数字转换为大写

    在提供的压缩包文件中,"小写数字转换为大写"可能包含了一个实现这个功能的代码文件,可能是用Python、Java、JavaScript或其他编程语言编写的。开发者可以查阅这个文件,学习如何构建这样的函数,或者直接在自己的...

    小写金额转换大写金额

    小写金额转换大写金额,小写金额转换大写金额.

    Android中数字转中文,金额转大写

    本文将深入探讨如何在Android环境中实现这一功能,包括数字转中文以及数字金额转大写,并且会涉及到口语化的转换。 首先,数字转中文主要是将阿拉伯数字(如1、2、3等)转换成中文数字(如一、二、三等)。在Java或...

    Java将小写数字变汉字

    将小写数字变大写 如 输入1234567 可以输出一二三四五六七

    java代码-使用java输入一个字符串,将字符串中的所有大写字母转换为小写字母,所有小写字母转换为大写字的源代码

    java代码-使用java输入一个字符串,将字符串中的所有大写字母转换为小写字母,所有小写字母转换为大写字的源代码 ——学习参考资料:仅用于个人学习使用!

    基于java的人民币大写的转换

    1. **数字转大写**:创建一个字符串数组,存储每个数字对应的汉字大写形式,例如:`{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}`。然后通过数字的值作为索引来获取对应的大写字符。 2. **处理...

    java实现接口返回数据实体类属性大写变成小写

    而且在我们转化过程中也是全部为大写的。 接着,我将缓存去掉了,检验一下是否跟缓存信息有关系? 去掉缓存之后依然是不正确的格式,仍是全部小写。 所以,没办法, 还得是去看响应实体中是否有问题,这时候我...

    小写金额转大写

    在IT行业中,编程语言Java是广泛使用的,尤其在金融、财务等领域,经常需要将小写的金额转换为大写的汉字表示,以满足规范的财务报告需求。这个“小写金额转大写”的主题就涉及到这样的一个功能实现。在这个压缩包...

    java:人民币小写转大写程序

    可以实现将 10002 转换成壹万零貮元整 10100021转换成壹千零壹拾万零貮拾壹元整 110.00 转换成壹佰壹拾元整 10.01 转换成壹拾元零壹分

    人民币大小写转换

    Java中关于金额小写转换为大写的工具类

Global site tag (gtag.js) - Google Analytics