Java之上数字转换(大小写转换,数字和英文交换,钱转换)

公司技能鉴定:

题目是从in,txt中读取文字,经过处理输出到out.txt中

 处理: 如果是阿拉波数字则需要,转化成英文显示  如:1 输出 ---->  1= one                1 001输出 ---->  1001= one thousand and one

       如果不是啊拉伯数字,则输出 原来的数字=error   如:  sdd123 输出 --> sdd123=error

规则: 只处理小于十位的数字 ,只处理正整数,不输出空行.复杂度不能超过10


呵呵 核心算法:

public static final String[] enNum = { // 基本数词表
 "zero", "one", "two", "three", "fuor", "five", "six", "seven", "eight",
   "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
   "fifteen", "sixteen", "seventeen", "eighteen", "nineteen",
   "twenty", "", "", "", "", "", "", "", "", "", "thirty", "", "", "",
   "", "", "", "", "", "", "fourty", "", "", "", "", "", "", "", "",
   "", "fifty", "", "", "", "", "", "", "", "", "", "sixty", "", "",
   "", "", "", "", "", "", "", "seventy", "", "", "", "", "", "", "",
   "", "", "eighty", "", "", "", "", "", "", "", "", "", "ninety" };

 public static final String[] enUnit = { "hundred", "thousand", "million",
   "billion", "trillion", "quintillion" }; // 单位表
   

... ... //文件操作和规则就省略了

   // 按3位分割分组
  int count = (num.length() % 3 == 0) ? num.length() / 3
    : num.length() / 3 + 1;
  if (count > enUnit.length) {
   return "too big";
  } // 判断组单位是否超过,
  // 可以根据需求适当追加enUnit
  String[] group = new String[count];
  for (int i = num.length(), j = group.length - 1; i > 0; i -= 3) {
   group[j--] = num.substring(Math.max(i - 3, 0), i);
  }

  StringBuilder buf = new StringBuilder(); // 结果保存
  for (int i = 0; i < count; i++) { // 遍历分割的组
   int v = Integer.valueOf(group[i]);
   if (v >= 100) { // 因为按3位分割,所以这里不会有超过999的数
    buf.append(enNum[v / 100]).append(" ").append(enUnit[0])
      .append(" ");
    v = v % 100; // 获取百位,并得到百位以后的数
    if (v != 0) {
     buf.append("and ");
    } // 如果百位后的数不为0,则追加and
   }
   if (v != 0) { // 前提是v不为0才作解析
    if (v < 20 || v % 10 == 0) { // 如果小于20或10的整数倍,直接取基本数词表的单词
     buf.append(enNum[v]).append(" ");
    } else { // 否则取10位数词,再取个位数词
     buf.append(enNum[v - v % 10]).append(" ");
     buf.append(enNum[v % 10]).append(" ");
    }
    if (i != count - 1) { // 百位以上的组追加相应的单位
     buf.append(enUnit[count - 1 - i]).append(" ");
    }
   }
  }

  return buf.toString().trim(); 


早上修改如下:


public static final String[] enNUM = { // 基本数词表
 "zero", "one", "tow", "three", "four", "five", "six", "seven", "eight","nine", "ten", 
 "eleven", "twelve", "thirteen", "fourteen","fifteen", "sixteen", "seventeen", 
 "eighteen", "nineteen","twenty",  "thirty", "fourty", "fifty", "sixty", "seventy", 
 "eighty", "ninety" };

 public static final String[] enUNIT = { "hundred", "thousand", "million",
   "billion", "trillion", "quintillion" }; // 单位表
   ... ...
   
   // 按3位分割分组
		int count = (num.length() % 3 == 0) ? num.length() / 3 : num.length() / 3 + 1;
		if (count > enUNIT.length) {
			return "too big";
		} // 判断组单位是否超过,
			// 可以根据需求适当追加enUnit
		String[] group = new String[count];
		for (int i = num.length(), j = group.length - 1; i > 0; i -= 3) {
			group[j--] = num.substring(Math.max(i - 3, 0), i);
		}

		StringBuilder buf = new StringBuilder(); // 结果保存
		for (int i = 0; i < count; i++) { // 遍历分割的组
			int v = Integer.valueOf(group[i]);
			if (v >= 100) { // 因为按3位分割,所以这里不会有超过999的数
				buf.append(enNUM[v / 100]).append(" ").append(enUNIT[0]).append(" ");
				v = v % 100; // 获取百位,并得到百位以后的数
				if (v != 0) {
					buf.append("and ");
				} // 如果百位后的数不为0,则追加and
			}
			if (v != 0) { // 前提是v不为0才作解析
				if (v < 20 ) { // 如果小于20,直接取基本数词表的单词
					buf.append(enNUM[v]).append(" ");
				}else if(v % 10 == 0){ //被10整出单个取值
					buf.append(enNUM[v/10 + 18]).append(" ");
				} else { // 否则取10位数词,再取个位数词
			  		buf.append(enNUM[v/10 + 18]).append(" ");
					buf.append(enNUM[v % 10]).append(" ");
				}
				if (i != count - 1) { // 百位以上的组追加相应的单位
					buf.append(enUNIT[count - 1 - i]).append(" ");
				}
			}
		}

		return buf.toString().trim(); 


==========================================================================================

考虑其他实现方法,暂时还有两个方案:

1.使用正则表达式来判断,简单化分隔(记得正则表达式中有判断钱的方法,没找到)

2.使用递归,.首先判断数字的位数,确认单位,然后分隔字符串传给递归函数处理。(当时我写的就是这个,结构很帅气,就是单位加不对。)

后续一一补上


附上以前写的钱转换方法


public static void main(String[] args) throws IOException {
		System.out.println("请输入金额:");
		System.out.println(convert(new BufferedReader(new InputStreamReader(System.in)).readLine()));
	}

	private static String convert(String s) {
		String[] numArr = new String[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
		String[] unitArr = new String[] { "圆", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟" };
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			int index = Integer.parseInt(String.valueOf(c));
			sb.append(numArr[index]);
			sb.append(unitArr[s.length() - 1 - i]);
		}
		String result = sb.toString();
		result = result.replaceAll("零[拾佰仟]", "零");
		result = result.replaceAll("零{2,}", "零");
		result = result.replaceAll("零萬", "萬");
		result = result.replaceAll("零億", "億");
		return result;
	}










你可能感兴趣的:(Java之上数字转换(大小写转换,数字和英文交换,钱转换))