`
shmilyyy
  • 浏览: 10728 次
  • 性别: Icon_minigender_1
  • 来自: 辽宁
社区版块
存档分类
最新评论

将阿拉伯数字转换成中文数字表示

阅读更多
package contest.numtochi;

import java.util.HashMap;
import java.util.Scanner;

public class NumToChi{
	//创建数字和中文数字一一对应的映射
	private HashMap<Integer, String> map;
	//创建位数和中文单位的一一映射
	private HashMap<Integer, String> unit;

	// 判断输入的字符串是否全是数字
	public boolean isNum(String str) {
		boolean flag = true;
		try {
			Integer.parseInt(str);
		} catch (Exception e) {
			flag = false;
			System.out.println("用户输入的字符不是数字");
		}

		return flag;
	}

	// 给map赋值,使数字和中文数字意义对应
	public void initMap() {
		map = new HashMap<Integer, String>();
		map.put(0, "零");
		map.put(1, "一");
		map.put(2, "二");
		map.put(3, "三");
		map.put(4, "四");
		map.put(5, "五");
		map.put(6, "六");
		map.put(7, "七");
		map.put(8, "八");
		map.put(9, "九");
	}

	// 给unit赋值,表示表示数字单位
	public void initUnit() {
		unit = new HashMap<Integer, String>();
		unit.put(0, "");
		unit.put(1, "十");
		unit.put(2, "百");
		unit.put(3, "千");
		unit.put(4, "万");
		unit.put(5, "十");
		unit.put(6, "百");
		unit.put(7, "千");
	}

	// 将全是数字的字符串转换成中文数字表示的方法
	public String change(String str) {
		String chinese = "";

		// 去掉头部的0
		str = String.valueOf(Integer.parseInt(str));
		// 将数字转换成中文数字
		for (int i = 0; i < str.length(); i++) {
			int index = str.charAt(i) - 48;
			chinese += map.get(index);
			chinese += unit.get(str.length() - i - 1);
		}
		
		// 处理字符串中的零
		while ((chinese.indexOf("零十") != -1) || (chinese.indexOf("零百") != -1)
				|| (chinese.indexOf("零千") != -1)
				|| (chinese.indexOf("零零") != -1)) {
			if (chinese.indexOf("零十") != -1) {
				chinese = chinese.replaceAll("零十", "零");
			}
			if (chinese.indexOf("零百") != -1) {
				chinese = chinese.replaceAll("零百", "零");
			}
			if (chinese.indexOf("零千") != -1) {
				chinese = chinese.replaceAll("零千", "零");
			}
			if (chinese.indexOf("零零") != -1) {
				chinese = chinese.replaceAll("零零", "零");
			}
		}
		
		if(chinese.indexOf("零万") != -1){
			chinese = chinese.replaceAll("零万", "万");
		}
		
		//如果结尾有零
		if(chinese.lastIndexOf("零") == chinese.length()-1){
			chinese = chinese.substring(0, chinese.length()-1);
		}

		return chinese;
	}

	public static void main(String[] args) {
		NumToChi ntc = new NumToChi();
		System.out.println("请输入要转换的数字字符串:");
		Scanner s = new Scanner(System.in);
		String str = s.next();
		if (ntc.isNum(str)) {
			ntc.initMap();
			ntc.initUnit();
			System.out.println(ntc.change(str));
		}
	}
}


0
6
分享到:
评论
1 楼 陈琰琰 2013-08-22  



写得不错,学习了,不过我稍微改了一下,不知道是否好用一些了。



package com;

import java.util.HashMap;
/**
*
*   
* @项目名称:util  
* @类名称:NumToChineseUtil  
* @类描述:  
* @创建人:Alan  
* @创建时间:2013-8-22 下午03:43:49  
* @修改人:Alan  
* 修改时间:2013-8-22 下午03:43:49  
* @修改备注:  
* @version   
*
*/
public class NumToChineseUtil{
//限制最大长度
private static int MAX_SIZE=13;

//创建数字和中文数字一一对应的映射
private static HashMap<Integer, String> map;

//创建位数和中文单位的一一映射
private static HashMap<Integer, String> unit;

/**
* 静态初始化数据
*/
static{
//给map赋值,使数字和中文数字意义对应
map = new HashMap<Integer, String>();
map.put(0, "零");
map.put(1, "一");
map.put(2, "二");
map.put(3, "三");
map.put(4, "四");
map.put(5, "五");
map.put(6, "六");
map.put(7, "七");
map.put(8, "八");
map.put(9, "九");

//给unit赋值,表示表示数字单位
unit = new HashMap<Integer, String>();
unit.put(0, "");
unit.put(1, "十");
unit.put(2, "百");
unit.put(3, "千");
unit.put(4, "万");
unit.put(5, "十");
unit.put(6, "百");
unit.put(7, "千");
unit.put(8, "亿");
unit.put(9, "十");
unit.put(10, "百");
unit.put(11, "千");
unit.put(12, "兆");
}


/**
* 工具类不对外提供实例化
*/
private NumToChineseUtil(){

}


/**
* 将全是数字的字符串转换成中文数字表示的方法
* @param target
* @return
*/
public static String numberChange(String target) {

String chinese = "";

//判断是否为合法数据
if(isCorrectNum(target)){

//去除字符串首部的零
target=removePreZero(target);

/**
* 将数字转换成中文数字同时加上单位
*/
int k=target.length()-1;

for (int i = 0; i < target.length(); i++) {
//char自动转成int加了48所以要得真实的数字应减去48
int index = target.charAt(i)-48; 
chinese += map.get(index);
chinese += unit.get(k);
k--;
}

if(chinese.indexOf("零兆") != -1){
chinese = chinese.replaceAll("零兆", "兆");
}
if(chinese.indexOf("零千亿") != -1){
chinese = chinese.replaceAll("零千亿", "零");
}
if(chinese.indexOf("零百亿") != -1){
chinese = chinese.replaceAll("零百亿", "零");
}
if(chinese.indexOf("零十亿") != -1){
chinese = chinese.replaceAll("零十亿", "零");
}
if(chinese.indexOf("零亿") != -1){
chinese = chinese.replaceAll("零亿", "亿");
}
if(chinese.indexOf("零万") != -1){
chinese = chinese.replaceAll("零万", "万");
}
if (chinese.indexOf("零千") != -1) {
chinese = chinese.replaceAll("零千", "零");
}
if (chinese.indexOf("零千") != -1) {
chinese = chinese.replaceAll("零千", "零");
}
if (chinese.indexOf("零十") != -1) {
chinese = chinese.replaceAll("零十", "零");
}
if (chinese.indexOf("零零") != -1) {
chinese = chinese.replaceAll("零零", "零");
}

//如果结尾有零
if(chinese.lastIndexOf("零") == chinese.length()-1){
chinese=chinese.replaceAll("零", "");
}
    }

return chinese;
}


/**
* 判断是否为合法数据
* @param target
* @return
*/
private static boolean isCorrectNum(String target){
if(isNotEmpty(target)){
if(isOutofMaxSize(target)){
if(isIntegerNum(target)){
return true;
}else{
throw new RuntimeException("要转换的字符串中有非数字字符!"); 
}
}else{
throw new RuntimeException("要转换的字符串长度不得超过"+MAX_SIZE+"位!");  
}
}else{
throw new RuntimeException("要转换的字符串为空!");  
}
}



/**
   * 不为空判断
   * @param target
   * @return
   */
private static boolean isNotEmpty(String target){
if(null==target){
return false;
}else{
target=target.trim(); //去两边的空格
if("".equals(target)){
return false;
}
}
  return true;
  }
 
  /**
   * 是否超规定长度
   * @param target
   * @return
   */
private static boolean isOutofMaxSize(String target){
  if(target.length()>MAX_SIZE){
  return false;
  }
  return true;
  }
 
  /**
   * 去除字符串首部的零
   * @param tagert
   * @return
   */
private static String removePreZero(String target){
  target=target.trim(); //去两边的空格
  char numchar[]=target.toCharArray();
  int index=0;
  for(int i=0;i<numchar.length;i++){
  if(numchar[i]!='0'){
  break;
  }
  index++;
  }
  target=target.substring(index);
  return target;
  }



/**
  * 判断输入的字符串是否是正整数
  * @param str
  * @return
  */
private static boolean isIntegerNum(String target) {
/**
* 1用JAVA自带的函数
*/
   for (int i = target.length();--i>=0;){  
   if (!Character.isDigit(target.charAt(i))){
      return false;
   }
}
  return true;
 
 
// 2用正则表达式
/* Pattern pattern = Pattern.compile("[0-9]*");
      return pattern.matcher(target).matches();  */
   
  //3用ascii码
     /* for(int i=target.length();--i>=0;){
          int chr=target.charAt(i);
          if(chr<48 || chr>57)
             return false;
       }
       return true;*/
}
}

相关推荐

    汉语数字串与阿拉伯数字串间转换小工具(C源码)

    本人用c写的完成汉语数字串与阿拉伯数字串间转换的一个小工具,完全基于串操作,不需要经过中间数值表示,原则上可以对任意长数字串进行转换,附带汉语数字串的大小写转换功能。

    阿拉伯数字金额转换为大写数字金额

    本例子将数字以汉字中的大写数字表示形式显示在页面中。例如“78.79”转换城”“柒拾捌元柒角玖分

    批量转换谐音数字为阿拉伯数字

    为便于操作,我使用Excel的Vbscrip功能编写了一个汉字转拼音(全拼)、中文数字转阿拉伯数字、谐音数字转阿拉伯数字的代码。 谐音转数字这个所涉及的字典太多,目前暂只考虑了0和字母o、零、琳、您转0的字典,其他...

    一个将阿拉伯数值转换成以中文大写数值的类

    将阿拉伯数字表示的货币数值转换成以中文大写表示的货币数值。可以支持十万元级别和百万元级别。

    基于C#的中文数字转为阿拉伯数字源码.rar

    阿拉伯数字转中文,是很容易的事。 但中文数字转为阿拉伯数字,却是不怎么好办的事,在网上查了很多资料,都没有找到。 有时,我们需要对中文数字排序,比如“第一章”、“第二章”、“第十章”等。 在转换过程...

    数字大小写转换程序python

    数字大小写转换是指将数字表示的阿拉伯数字(例如123)转换为相应的中文大写数字(例如一百二十三)或英文单词形式(例如One Hundred Twenty-Three),或者将中文大写数字或英文单词形式转换为阿拉伯数字。

    C#商品金额大小写转换

    C#商品金额大小写转换,根据输入的阿拉伯数字,转化为中文的汉字,并带上单位输出

    Visual Foxpro小写转大写代码

    是一个自定义函数,将阿拉伯数字表示的金额转换成标准的中文大写。

    Excel公式与函数大辞典.宋翔(带书签高清文字版).pdf

    2.6.6 ARABIC——将罗马数字转换为阿拉伯数字 114 2.6.7 BASE——将一个数转换为给定基数的文本格式 115 2.6.8 DECIMAL——将给定基数的文本转换为十进制数 116 第3章 日期和时间函数 117 3.1 了解Excel日期系统...

    Excel百宝箱9.0无限制破解版.rar

    函数功能与参数:与“大写”函数相反,将大写字符转换为阿拉伯数字。 函数名称:分割取数 函数功能与参数:按分割符取数。第一参数为单元格,第二参数表示取第N个,第三个参数表示分割符。 函数名称:共有项 ...

    Exce百宝箱——2012版本.rar

    函数功能与参数:与“大写”函数相反,将大写字符转换为阿拉伯数字。 函数名称:分割取数 函数功能与参数:按分割符取数。第一参数为单元格,第二参数表示取第N个,第三个参数表示分割符。 函数名称:共有项 函数...

    leetcode给单链表加一js实现-leetcode-By[removed]LeetCode解决方案(全部通过JavaScript!)h

    leetcode给单链表加一js实现 LeetCode By JavaScript LeetCode Solutions (All By JavaScript!) 的个人Solutions汇总,全部使用JavaScript完成:grinning_squinting_...将阿拉伯数字转换为罗马数字 38 Count and Say:

    Excel函数活用范例大辞典(全新版).何先军.2015-2(带书签高清文字版).pdf

    142 将文本数字转换为数值并计算利润 290 143 从身份证号码中提取员工的性别信息 292 144 从身份证号码中提取员工的生日信息 294 145 快速恢复以科学计数法显示的商品条形码 296 146 将数字金额转换为...

    PHP详解ASCII码对照表与字符转换

    以字符A为例Dec表示十进制,如65Hx表示十六进制,如41Oct表示八进制,如101Char表示显示字符,如AASCII码对照表图分为两个单元1,控制字符 0-31和1272,可显示字符 32-126(1)48~57为0到9十个阿拉伯数字;...

    计算机基础知识-编码表.doc

    于是除了0、1这些阿拉伯 数字,像a、b、c这样的52个字母(包括大小写),还有一些特殊的符号(例如*、#、@ 等)在计算机中存储时也要使用二进制数来表示,具体用哪些二进制数表示哪些符号, 理论上每个人都可以有...

    VC++6.0核心编程源码.rar

    ErrorShow示例应用程序(本章后面将加以介绍)展示了如何调用该函数,以便将Microsoft公司定义的错误代码转换成它的文本描述。 有些人常常问我,Microsoft公司是否建立了一个主控列表,以显示每个Windows函数可能...

    千方百计笔试题大全

    28、char 型变量中能不能存贮一个中文汉字?为什么? 10 29、abstract class 和interface 有什么区别? 10 30、Static Nested Class 和Inner Class 的不同? 11 31、java 中会存在内存泄漏吗,请简单描述。 11 32、...

    java面试宝典

    28、char 型变量中能不能存贮一个中文汉字?为什么? 10 29、abstract class 和interface 有什么区别? 10 30、Static Nested Class 和Inner Class 的不同? 11 31、java 中会存在内存泄漏吗,请简单描述。 11 32、...

Global site tag (gtag.js) - Google Analytics