`

面授竞赛试题(包含数字转换为中文大写)

    博客分类:
  • java
阅读更多
这些代码都是自己写出来没有经过修改的
第一题(这个答案可能还有些地方没有考虑到,比如10001000的时候结果就差一个零):
package com.shengshiyuan.competition;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DigitalConversion {

	public void conversion(String str) {
		// 首先用正则表达式判断是否都为数字
		if (this.isNumeric(str)) {
			// 最多输入8个字符
			if (str.length() <= 8) {
				String result = this.getNumberToRMB(str);
				System.out.println(result);
			} else {
				System.out.println("用户输入的字符个数不能多于8个!");
			}
		} else {
			System.out.println("用户输入的字符不都为数字,无法转换!");
		}
	}

	/**
	 * 利用正则表达式判断是否都为数字
	 * 方法: isNumeric <br>
	 * 描述: TODO <br>
	 * 作者: 
	 * 时间: Nov 4, 2013 11:08:50 AM
	 * @param str
	 * @return
	 */
	public boolean isNumeric(String str) {
		Pattern pattern = Pattern.compile("[0-9]*");
		Matcher isNum = pattern.matcher(str);
		if (!isNum.matches()) {
			return false;
		}
		return true;
	}

	/**
	 * 
	 * 方法: getNumberToRMB <br>
	 * 描述: 将数值转换成人民币大写,根据网上一搜索整理修改而成 仍然有两个Bug 1、万亿以上可能出错 2、连续0可能出错
	 * 作者: 
	 * 时间: Nov 4, 2013 11:31:48 AM
	 * @param rmb
	 * @return
	 */
	public String getNumberToRMB(String rmb) {
		/**//*
			 * 人民币表达式中使用的中文字符(num)及计量单位位字符(dw)
			 */
		// String num = "零壹贰叁肆伍陆柒捌玖";
		String num = "零一二三四五六七八九";
		String dw = "个十百千万亿";
		// 补齐小数位,多加“0”不影响计算和转换
		// rmb += rmb.indexOf(".") == -1 ? ".00" : "00";

		// String mm[] = rmb.split("//.");
		// System.out.println("mm" + mm);
		// String money = mm[0];
		String money = rmb;
		System.out.println(money);
		// String money = rmb;
		/**//*
			 * 转换小数部分
			 */
		// String result = num.charAt(Integer.parseInt("" + mm[1].charAt(0)))
		// + "角" + num.charAt(Integer.parseInt("" + mm[1].charAt(1)))
		// + "分";
		String result = "";
		// String result = "";

		if (money.startsWith("0")) {
			while (money.startsWith("0")) {
				money = money.substring(1, money.length());
			}
		}
		/**//*
			 * 设置循环,从整数最低位开始转换
			 */
		for (int i = 0; i < money.length(); i++) {// i=位数,从个位开始取值
			String str = "";
			int n = Integer.parseInt(money.substring(money.length() - i - 1,
					money.length() - i));// 当前位的数值=n
			System.out.println("n" + n);
			str = str + num.charAt(n);// 根据数值取出中文大写字符
			System.out.println("str" + str);
			// 根据位数判断
			if (i == 0) {
				str += dw.charAt(i);// 加上个
			} else if ((i + 4) % 8 == 0) {
				str += dw.charAt(4);// 加上万
			} else if (i % 8 == 0) {
				str += dw.charAt(5);// 加上亿
			} else {
				str += dw.charAt(i % 4);// 不为整就求余(加上十百千)
			}
			result = str + result;// 把当前字符加到最前面(最高位)
		}
		System.out.println("result:" + result);
		result = result.substring(0, result.length() - 1);
		result = result.replaceAll("零([^亿万])", "零");
		result = result.replaceAll("亿零+万", "亿零");
		result = result.replaceAll("零+", "零");
		result = result.replaceAll("零([亿万元])", "$1");
		result = result.replaceAll("一十", "十");
		// result = result.replaceAll("^元", "");
		// result = result.replaceAll("零角零分", "整");
		// result = result.replaceAll("零分", "整");
		if (result.endsWith("零")) {
			result = result.substring(0, result.length() - 1);
		}
		return result;
	}

	public static void main(String[] args) {
		new DigitalConversion().conversion("10000100");
	}
}




第二题:
package com.shengshiyuan.competition;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解
 * 类: Test <br>
 * 描述: TODO <br>
 * 作者: 
 * 时间: Nov 1, 2013 10:51:18 AM
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test {

}

package com.shengshiyuan.competition;

/**
 * 供程序详解类
 * 类: MyClass <br>
 * 描述: TODO <br>
 * 作者: 
 * 时间: Nov 1, 2013 10:49:02 AM
 */
public class MyClass {

	public void method1() {
		System.out.println("method1");
	}

	@Test
	public void method2() {
		System.out.println("method2");
	}

	@Test
	public int add(int a, int b) {
		return a + b;
	}

	@Test
	public void doSomething(String str) {
		System.out.println(str);
	}

	@Test
	public void doSomething2() {
		System.out.println("doSomething2()");
	}

}

package com.shengshiyuan.competition;

import java.lang.reflect.Method;

/**
 * 当用户将类的全名以字符串的形式传递给该run方法时,run方法会自动执行用户所提供的类中的所有被@Test注解所修饰的public void 且不带参数的方法
 * 类: ApplicationRun <br>
 * 描述: TODO <br>
 * 作者: 
 * 时间: Nov 1, 2013 10:54:07 AM
 */
public class ApplicationRun {
	public void run(String className) throws Exception {
		Class<?> targetClass = Class.forName(className);
		Object object = targetClass.newInstance();
		Method[] methods = targetClass.getDeclaredMethods();

		for (Method method : methods) {
			// 注解里面包含Test注解
			if (null != method.getAnnotation(Test.class)) {
				Class<?>[] parameClass = method.getParameterTypes();
				if (0 == parameClass.length) {
					// 调用method对应方法
					method.invoke(object, new Object[] {});
				}
			}
		}
	}

	public static void main(String[] args) throws Exception {
		ApplicationRun application = new ApplicationRun();
		application.run("com.shengshiyuan.competition.MyClass");
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics