zoukankan      html  css  js  c++  java
  • 将阿拉伯数字转为中文大写读法

    /**
     * 问题描述:
     * 		将一个键盘输入的数字转化成中文输出,使用异常捕获输入的非法字符。
     *      (例如:输入:1234567     输出:一百二拾三万四千五百六拾七)
     *      
     * @author 常维军
     * 		      创建时间:2012-8-8
     * 
     * 思想:
     * 对于一串数字一般读法是固定的
     * 			口亿口千口百口拾口万口千口百口拾口
     * 		1,从控制台读入一串数字
     * 		2,对数字转换为字符串           		1234567                    ------->  "1234567"
     * 		3,将字符串逆序                      		"1234567"                  -------> "7654321"
     * 		4,格式化                                			"7654321"                  -------> "一拾二百三千四万五拾六百七"
     * 		5,对上述字符串进行逆序后返回     	"一拾二百三千四万五拾六百七" -------> "七百六拾五万四千三百二拾一"
     * 		5,对含零值进行单独处理:  
     * 							情况如下:5000 ----->  直接返回   "五千"     
     * 									 5001 ----->   返回      "五千零一"
     * 								    
     * 
     */
    
    import java.util.Scanner;
    
    public class TestExchange {
    	public static void main(String[] args) {
    		// 接收控制台输入的数字
    		System.out.println(numberProcess(getInt()));
    	}
    
    	/**
    	 * 安全的接受一个整数
    	 * 
    	 * @return 一个整数
    	 */
    	public static int getInt() {
    		System.out.println("请输入一个整数,按Enter键结束:");
    		int input = 0;
    		Scanner sc = new Scanner(System.in);
    
    		try {
    			input = sc.nextInt();
    		} catch (Exception e) {
    			input = getInt();
    		}
    		return input;
    	}
    
    	public static String numberProcess(int number) {
    		String inputProcess = String.valueOf(number);
    		StringBuilder input = new StringBuilder(inputProcess);
    		input.reverse();
    		StringBuilder outTemp = new StringBuilder();
    		char c;
    		for (int i = 0; i < input.length(); i++) {
    			c = input.charAt(i);
    			switch (i + 1) {
    			case 1:
    				outTemp.append(dealWithChar(c));
    				break;
    			case 2:
    				outTemp.append('拾');
    				outTemp.append(dealWithChar(c));
    				break;
    			case 3:
    				outTemp.append('百');
    				outTemp.append(dealWithChar(c));
    				break;
    			case 4:
    				outTemp.append('千');
    				outTemp.append(dealWithChar(c));
    				break;
    			case 5:
    				outTemp.append('万');
    				outTemp.append(dealWithChar(c));
    				break;
    			case 6:
    				outTemp.append('拾');
    				outTemp.append(dealWithChar(c));
    				break;
    			case 7:
    				outTemp.append('百');
    				outTemp.append(dealWithChar(c));
    				break;
    			case 8:
    				outTemp.append('千');
    				outTemp.append(dealWithChar(c));
    				break;
    			case 9:
    				outTemp.append('亿');
    				outTemp.append(dealWithChar(c));
    				break;
    			case 10:
    				outTemp.append('拾');
    				outTemp.append(dealWithChar(c));
    				break;
    			}
    		}
    
    		outTemp = outTemp.reverse();
    		StringBuilder output = new StringBuilder();
    		for (int i = 0; i < outTemp.length() - 1; i++) {
    			int j = i;
    			char ch = outTemp.charAt(i);
    
    			int len = outTemp.length() - i;
    
    			// 对万位情况进行处理, 如不处理,1000000,只会返回一百,同时应该保证千万位,百万位为零会多出万字的情况
    			if (len >= 9 && len <= 15) {
    				if (ch == '零' && len == 9) {
    					output.append("万");
    				}
    			}
    			// 同上,对亿位进行处理
    			if (len > 15) {
    				if (ch == '零' && len == 15) {
    					output.append("亿");
    				}
    			}
    
    			/**
    			 * 五万零千零百零拾一 创建输出处理临时空间
    			 * i指针,从左向右扫描(字符的最后一位不扫描,单独处理),若不是'零',将该字符值添加到临时空间中 遇到'零'
    			 * 暂停,j指针,开始从i暂停位置开始扫描(字符的最后一位不扫描,单独处理)
    			 * 若遇到'零'继续向后扫描,没有遇到'零'结束。向临时空间中添加一个'零',i从j的位置开始继续扫描。
    			 * 
    			 * 对最后一位的处理: 
    			 * 若最后一位为零:去除临时空间中的最后一个字符,即:'零'
    			 * 若最后一位不是零:将最后一位字符添加到临时空间
    			 */
    			if (ch != '零') {
    				output.append(ch);
    			} else {
    				char chs = outTemp.charAt(j);
    				while (chs == '零' && j < outTemp.length() - 1) {
    					j = j + 2;
    					chs = outTemp.charAt(j);
    				}
    				output.append('零');
    				i = j - 1;
    			}
    		}
    
    		// 对最后一位进行处理
    		char cha = outTemp.charAt(outTemp.length() - 1);
    
    		if (cha != '零') {
    			output.append(cha);
    		} else {
    			output.deleteCharAt(output.length() - 1);
    		}
    
    		return output.toString();
    	}
    
    	/**
    	 * 将数字转为大写 作用: 单纯的字符转换
    	 * 
    	 * @param c
    	 *            数字的字符
    	 */
    	public static char dealWithChar(char c) {
    		switch (c) {
    		case '0':
    			return '零';
    		case '1':
    			return '一';
    		case '2':
    			return '二';
    		case '3':
    			return '三';
    		case '4':
    			return '四';
    		case '5':
    			return '五';
    		case '6':
    			return '六';
    		case '7':
    			return '七';
    		case '8':
    			return '八';
    		case '9':
    			return '九';
    		}
    
    		return ' ';
    	}
    }
    

  • 相关阅读:
    [转]使用RenderQueueListener针对不同的渲染组改变摄像机的裁剪面
    [转]Calculating Stereo Pairs
    [转]Ogre如何在渲染时切换指定物体的材质技术
    <转>C#操作word
    SQL常用语句二
    SQL高级查询
    C# word打印文档打印不全(数据为完全发送至打印机,程序已经退出)
    access事务插入多条记录
    C#操作word的一些基本方法(word打印,插入文件,插入图片,定位页眉页脚,去掉横线)
    Sqlserver 存储过程中结合事务的代码
  • 原文地址:https://www.cnblogs.com/wjchang/p/3671585.html
Copyright © 2011-2022 走看看