`
cjf068
  • 浏览: 34340 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

中文数字到阿拉伯数字转换

 
阅读更多
昨天博客上看到一童鞋面试微软的题目:
将中文数字转换成阿拉伯数字表示:
如 五千零一-->5001 五千一 5100

package org.jf.alg;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;


/**
 * 
 * @author junfeng.chen
 *
 */
public class DigitTranslator {
	
	private static String [] CH_NUM_ARRAY = {"零","一","二","三","四","五","六","七","八","九"};
	private static String [] CH_UNIT_ARRAY = {"个","十","百","千","万","亿"};
	
	
	private static final Map<String,Integer> UNIT_MAP  = new HashMap<String,Integer>();
	private static final Map<String,Integer> DIGIT_MAP = new HashMap<String,Integer>();
	
	static 
	{
		UNIT_MAP.put("个", 1);
		UNIT_MAP.put("十", 10);
		UNIT_MAP.put("百",100);
		UNIT_MAP.put("千",1000);
		UNIT_MAP.put("万",10000);
		UNIT_MAP.put("亿",100000000);
		
		for(int i=0;i<CH_NUM_ARRAY.length;i++)
		{
			DIGIT_MAP.put(CH_NUM_ARRAY[i], i);
		}
	
	}
	/**
	 * 将中文格式的数字字符串转换为数字
	 * @param ch_style_str
	 * @return
	 */
	public static long toMathNumber(String ch_style_str)
	{
		List<String> groups = split(ch_style_str);
		
		long sum = 0 ;
		for(String str : groups)
		{
			sum += translate(str);
		}
		
		return sum;
	}
	
	private static int translate(String str)
	{
		String last_char = str.charAt(str.length()-1)+"";
		if(DIGIT_MAP.containsKey(last_char))//如果最后一个是数字 查找前一个单位 
		{
			String last_unit = "";
			for(int indx = str.length()-2;indx>=0;indx--)
			{
				String ch = str.charAt(indx)+"";
				if(UNIT_MAP.containsKey(ch))
				{
					int i=0;
					for(;i<CH_UNIT_ARRAY.length;i++)
					{
						if(CH_UNIT_ARRAY[i] .equals(ch) )
							break;
					}
					last_unit = CH_UNIT_ARRAY[--i];
					break;
				}else if(ch.equals("零"))
				{
					last_unit = "个";
					break;
				}
			}
			str = str+last_unit;
		}
		int pre_unit = 1;
		boolean is_last_unit = false;
		
		Stack<Integer> stack = new Stack<Integer>();
		
		for(int i=0;i<str.length();i++)
		{
			String ch = str.charAt(i)+"";
			if(UNIT_MAP.get(ch)!=null)
			{
				int unit = UNIT_MAP.get(ch);
				if(stack.isEmpty())
				{
					stack.push(unit*1);
				}
				else
				{
					
					if(is_last_unit)
					{
						int t = stack.pop();
						t = t* unit;
						stack.push(t);
					}else
					{
						
						if(unit > pre_unit)
						{
							int t = stack.pop();
							if(!stack.isEmpty())
								t = t+stack.pop();
							t*=unit;
							stack.push(t);
						}else
						{
							int t = stack.pop();
							t*=unit;
							if(!stack.isEmpty())
								stack.push(t+stack.pop());
							
						}
					}
					
				}
				is_last_unit = true;
				pre_unit = unit;
			}else
			{
				int num = DIGIT_MAP.get(ch);
				stack.push(num);
				is_last_unit = false;
			}
		}
		int res = stack.pop();
		while(!stack.isEmpty())
			res = stack.pop() + res;

		return res;
	}
	
	private static  List<String> split(String ch_style_str)
	{
		int unit = -1;
		int last_pre_num = 0;

		String ch = "";
		Stack<UnitRecord> unit_stack = new Stack<UnitRecord>();
		List<String> groups = new ArrayList<String>();
		
		//遍历字符串 获得一个单位字符时:
		/**
		 * 查看栈顶元素
		 *  如果栈顶  > unit  则push
		 *  如果 栈顶 < = unit 则
		 *   pop 直到栈顶 > unit
		 *   并用unit与最后一个pop出来的元素的下标取子字符串 形成一个分组
		 */
		
		for(int i=0;i<ch_style_str.length();i++)
		{
			ch = ch_style_str.charAt(i)+"";
			if(UNIT_MAP.get(ch)!=null)
			{
				unit = UNIT_MAP.get(ch);
				UnitRecord record = new UnitRecord();
				record.unit = unit;
				record.index = i;
				
				record.pre_num = last_pre_num;
				last_pre_num = 0;
				if(unit_stack.isEmpty())
				{
					unit_stack.push(record);
				}else
				{
					
					UnitRecord pre_record = unit_stack.peek();
					UnitRecord pre_record1 = null;//最后一次pop出来的元素
					if(record.compareTo(pre_record)>0)
					{
						while(record.compareTo(pre_record)>0 && !unit_stack.isEmpty())
						{
							pre_record1 = unit_stack.pop();
							if(!unit_stack.isEmpty())
								pre_record = unit_stack.peek();
						}
						
						groups.add(ch_style_str.substring(pre_record1.index-pre_record1.pre_num, i+1));
						
					}else
					{
						unit_stack.push(record);
					}
				}
				
			}else
			{
				last_pre_num ++;
			}
		}
		
		if(!unit_stack.isEmpty())
		{
			UnitRecord pre_record = unit_stack.peek();
			while(!unit_stack.isEmpty())
			{
				pre_record = unit_stack.pop();
			}
			groups.add(ch_style_str.substring(pre_record.index - pre_record.pre_num));
		}
		
		return groups;
	}
	
	private static class  UnitRecord implements Comparable
	{
		 int index;
		 int unit;
		 int pre_num = 0;//与前一个单位之间的元素个数
		@Override
		public int compareTo(Object o) {
			UnitRecord u = (UnitRecord)o;
			
			if(this.unit == u.unit)
				return 0;
			if (this.unit > u.unit)
				return 1;
			
			return -1;
		}
		 
		 
	}

	public static void main(String args[])
	{
		String s = "十四亿零二十三万五千一百二十";
//		
		String ss = "五千万零四百七十";
		System.out.println(toMathNumber(s));
		System.out.println(toMathNumber(ss));
		System.out.println(translate("五千零一百"));
		System.out.println(translate("二千零一"));
		System.out.println(translate("零七零"));
	}
}

分享到:
评论

相关推荐

    中文数字转换阿拉伯数字

    在IT领域,中文数字转换阿拉伯数字是一个常见的编程需求,尤其在中国的文化背景下,有时需要将中文表述的数字转化为阿拉伯数字用于计算或数据处理。这个任务涉及到自然语言处理(NLP)和字符串处理技术,通常通过...

    中文数字转换为阿拉伯数字

    将一段字符串中的中文数字转换为阿拉伯数字,也可将阿拉伯数字转换为中文数字

    java实现阿拉伯数字 转换为 汉字数字 算法

    java实现阿拉伯数字 转换为 汉字数字 算法

    中文数字转成阿拉伯数字 java 实现

    在Java编程语言中,将中文数字转换为阿拉伯数字是一个常见的需求,特别是在处理中文文本数据时。这个场景下,我们有一个名为“中文数字转成阿拉伯数字 java 实现”的压缩包,包含了一个实现此功能的Java包和一个单元...

    阿拉伯数字转换为中文小写数字

    阿拉伯数字有10个基本符号(0-9),而中文小写数字也有对应的十个汉字(零、一、二、三、四、五、六、七、八、九)。我们可以通过创建一个映射表来存储这种对应关系,例如: ```java Map, String&gt; numMap = new ...

    中文数字转化成阿拉伯数字

    本篇文章将深入探讨如何在C#中实现中文数字到阿拉伯数字的转化。 首先,中文数字与阿拉伯数字的对应关系是基础。中文数字包括个、十、百、千、万、亿等单位,每个单位对应阿拉伯数字的一个或几个位数。例如,“一”...

    转换汉字数字为阿拉伯数字

    输入万亿以下汉字数,可变为相应阿拉伯数字,附易语言源码,例如:五百八十万四千六百五十五对应为5804655

    中文数字转换为阿拉伯数字,范围1-999

    改代码支持将中文数字转换为阿拉伯数字,转换的范围到999为止,并且只能转换简单整数

    中文数字转换阿拉伯数字.rar

    综上所述,中文数字转换至阿拉伯数字涉及到语言学、计算逻辑以及编程技术等多个方面,是信息技术处理中文数据时的一项基础任务。通过理解转换规则和运用合适的编程手段,我们可以有效地解决这类问题。

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

    两者间的转换需要将汉字字符映射到对应的阿拉伯数字,反之亦然。 在这个小工具中,`digit_convert.c`和`digit_convert.h`文件很可能是实现转换功能的核心代码。`digit_convert.c`可能包含了具体的函数实现,如将...

    将阿拉伯数字转换为汉字数字

    总之,阿拉伯数字到汉字数字的转换是中文编程中常见的需求,`arabChange.dll`提供了这样的功能,使得C#开发者可以方便地将阿拉伯数字转化为符合中文阅读习惯的汉字数字。通过理解和正确使用这个库,可以提高代码的...

    c和lua的中文和阿拉伯数字互转

    首先,让我们讨论如何在C语言中实现中文数字到阿拉伯数字的转换。中文数字包括个、十、百、千、万等单位,需要通过识别这些单位并进行相应的数学运算来转换。例如,“一”代表1,“二”代表2,“三”代表3,“十”...

    将阿拉伯数字转换为汉字数字或者汉字大写金额

    1、该dll能将阿拉伯数字转换为汉字数字或者中文大写金额。例如1234567.07可转换为: “一百二十三万四千五百六十七点零七”或“壹佰贰拾叁万肆仟伍佰陆拾柒圆零柒分”。 目前支持正负千亿以内(整数部分不超过12位)...

    阿拉伯数字转换为中文大写

    "阿拉伯数字转换为中文大写" 阿拉伯数字转换为中文大写是将阿拉伯数字转换为中文大写数字的过程。在这个过程中,我们需要使用数组来存储中文大写数字和单位,然后通过遍历阿拉伯数字字符串,逐个将数字转换为中文...

    汉语大写数字转换成阿拉伯数字

    汉语大写数字转换成阿拉伯数字。支持如下转换 '一千二百二十一万九千三百五十七亿一千二百二十一万九千零五十七', '一千二百二十一', '一千零十', '一万零一百', '一千零十一', '一万零一百十一', '一千二百...

    阿拉伯数字转换成中文.sql

    阿拉伯数字转换成中文数字, 例如: 10转换成十,111转换成一百一十一 最高支持的数字单位亿, 再大的话可能需要自己修改

    阿拉伯数字转中文数字(vb)

    3. 使用条件语句或查找表,将每一位阿拉伯数字转换为对应的中文数字,并添加到`result`字符串中。 4. 处理中文的“十”、“百”、“千”等单位。在合适的位数(比如每四位)加入相应的中文单位,但需要注意去除不必...

    delphi阿拉伯数字转换成中文写法

    把阿拉伯数字转为汉字写法比如123456789转化为零壹贰叁肆伍陆柒捌玖,以及几百几千几万的数字都可以转化

    汉字金额转换为阿拉伯数字

    在描述中提到,虽然网络上有许多关于将阿拉伯数字转换为汉字的教程,但作者决定编写一个相反方向的转换工具,这显示了对特定需求的响应和解决实际问题的能力。 在实现这个功能时,首先需要定义一个汉字金额字典,...

Global site tag (gtag.js) - Google Analytics