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

一个我写的把中文数字转换成integer的小工具

    博客分类:
  • java
阅读更多
似乎阿拉伯数字转中文的有很多,中文转阿拉伯数字的没找到过,所以自己写了个。
只能转整数的,小数因为我的应用不会碰到所以没考虑,不过要加也很容易。
大家帮看下有什么问题没有,或者有什么改进的建议


之前的代码有些问题,在遇到“十”开头的时候会得到错误的结果。现在的为修改后的代码,大家帮看下是否还有其他问题

package com.mnv.crawler.parser.misc;

public class NumberParser {
	
	/**
	 * 把中文数字解析为阿拉伯数字(Integer)
	 * @param chineseNumber 中文数字
	 * @return 阿拉伯数字(Integer),如果是无法识别的中文数字则返回-1
	 */
	public static int parseChineseNumber(String chineseNumber){
		chineseNumber=chineseNumber.replace("仟", "千");
		chineseNumber=chineseNumber.replace("佰", "百");
		chineseNumber=chineseNumber.replace("拾", "十");
		chineseNumber=chineseNumber.replace("玖", "九");
		chineseNumber=chineseNumber.replace("捌", "八");
		chineseNumber=chineseNumber.replace("柒", "七");
		chineseNumber=chineseNumber.replace("陆", "六");
		chineseNumber=chineseNumber.replace("伍", "五");
		chineseNumber=chineseNumber.replace("肆", "四");
		chineseNumber=chineseNumber.replace("叁", "三");
		chineseNumber=chineseNumber.replace("贰", "二");
		chineseNumber=chineseNumber.replace("壹", "一");
		return parseChineseNumber(chineseNumber,1);
	}
	
	/**
	 * 把中文数字解析为阿拉伯数字(Integer)
	 * @param preNumber 第二大的进位
	 * @param chineseNumber 中文数字
	 * @return 阿拉伯数字(Integer),如果是无法识别的中文数字则返回-1
	 */
	private static int parseChineseNumber(String chineseNumber,int preNumber){
		int ret=0;
		if(chineseNumber.indexOf("零")==0){
			int index=0;
			int end=chineseNumber.length();
			String prefix=chineseNumber.substring(index+1,end);
			ret=parseChineseNumber(prefix,1);
		}else if(chineseNumber.indexOf("亿")!=-1){
			int index=chineseNumber.indexOf("亿");
			int end=chineseNumber.length();
			String prefix=chineseNumber.substring(0,index);
			if(prefix.length()==0){
				prefix="一";
			}
			String postfix=chineseNumber.substring(index+1,end);
			ret=parseChineseNumber(prefix,1)*100000000+parseChineseNumber(postfix,10000000);
		}else if(chineseNumber.indexOf("万")!=-1){
			int index=chineseNumber.indexOf("万");
			int end=chineseNumber.length();
			String prefix=chineseNumber.substring(0,index);
			if(prefix.length()==0){
				prefix="一";
			}
			String postfix=chineseNumber.substring(index+1,end);
			ret=parseChineseNumber(prefix,1)*10000+parseChineseNumber(postfix,1000);
		}else if(chineseNumber.indexOf("千")!=-1){
			int index=chineseNumber.indexOf("千");
			int end=chineseNumber.length();
			String prefix=chineseNumber.substring(0,index);
			if(prefix.length()==0){
				prefix="一";
			}
			String postfix=chineseNumber.substring(index+1,end);
			ret=parseChineseNumber(prefix,1)*1000+parseChineseNumber(postfix,100);
		}else if(chineseNumber.indexOf("百")!=-1){
			int index=chineseNumber.indexOf("百");
			int end=chineseNumber.length();
			String prefix=chineseNumber.substring(0,index);
			if(prefix.length()==0){
				prefix="一";
			}
			String postfix=chineseNumber.substring(index+1,end);
			ret=parseChineseNumber(prefix,1)*100+parseChineseNumber(postfix,10);
		}else if(chineseNumber.indexOf("十")!=-1){
			int index=chineseNumber.indexOf("十");
			int end=chineseNumber.length();
			String prefix=chineseNumber.substring(0,index);
			if(prefix.length()==0){
				prefix="一";
			}
			String postfix=chineseNumber.substring(index+1,end);
			ret=parseChineseNumber(prefix,1)*10+parseChineseNumber(postfix,1);
		}else if(chineseNumber.equals("一")){
			ret=1*preNumber;
		}else if (chineseNumber.equals("二")){
			ret=2*preNumber;
		}else if (chineseNumber.equals("三")){
			ret=3*preNumber;	
		}else if (chineseNumber.equals("四")){
			ret=4*preNumber;
		}else if (chineseNumber.equals("五")){
			ret=5*preNumber;
		}else if (chineseNumber.equals("六")){
			ret=6*preNumber;
		}else if (chineseNumber.equals("七")){
			ret=7*preNumber;
		}else if (chineseNumber.equals("八")){
			ret=8*preNumber;
		}else if (chineseNumber.equals("九")){
			ret=9*preNumber;
		}else if (chineseNumber.length()==0){
			ret=0;
		}else {
			ret=-1;
		}
		return ret;
	}
	
	public static void main(String[] args){
		int a=1000000000;
		System.out.println(parseChineseNumber("十亿"));
	}
}

分享到:
评论

相关推荐

    大小写金额转换-源码

    (三)阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”, 万位、元位也是“0’,但千位、角位不是“0”时,中文大写金额中 可以只写一个零字,也可以不写“零”字。如¥1,680.32,应写成 人民币壹...

    《你必须知道的495个C语言问题》

    当我把函数指针赋向void *类型的时候,编译通不过。 51 4.14 怎样在整型和指针之间进行转换?能否暂时把整数放入指针变量中,或者相反? 51 *4.15 我怎样把一个int变量转换为char *型?我试了类型转换,但是不行...

    精确计算工具类

    * 提供精确的String转换成double * @param v * @return */ public static double strPreDou(String v) { BigDecimal b = new BigDecimal(v); return b.doubleValue(); } /** * 提供精确的加法运算。 * @...

    Android静默安装常用工具类

    getLast(V[] sourceArray, V value, V defaultValue, boolean isCircle) 得到数组中某个元素前一个元素,isCircle表示是否循环 getNext(V[] sourceArray, V value, V defaultValue, boolean isCircle) 得到数组中...

    落叶高精度表达式计算器v1.0

    当你把某一个函数调顺后,进行综合运算时,会出现很多新的问题。 高精度数据结构VB定义为: Type StrToZx '高精度数的结构头 ZhFhBz As Boolean '正负号标志 XsdWz As Long '小数点右边数字的长度。例1234.567中...

    Java开发技术大全(500个源代码).

    HelloNative.c 用C写的一个小程序 HelloNative.dll 用C生成的DLL文件 HelloNative.exp 用VC编译生成的辅助文件 HelloNative.h 用javah生成的C语言用的头文件 HelloNative.java 准备调用C函数的java文件 ...

    JavaScript常用函数工具集:lao-utils

    在工作中经常会频繁使用一些方法、或做类型判断、数据转换等,为了方便,将一些功能封装成函数整理成工具集lao-utils 使用 Node.js npm install lao-utils --save AMD/CMD、浏览器环境 引入dist目录下源码文件 ...

    Visual Integer Factor:益智游戏演示二进制整数分解有何困难-开源

    VisualIntFactor将是一个交互式的教育和科学工具,展示在同一个六边形网格中的乘法,因子,一元计数和二进制整数之间的转换。 该网格基于帕斯卡三角形,该三角形是一维元胞自动机,通过将每个像元作为上下两个元胞的...

    PL/SQL 基础.doc

    PL/SQL 基础,一个不错的 PL/SQL 参考手册。内容预览: ---- 第一章 PL/SQL 简介 ---- 1. Oracle应用编辑方法概览 1) Pro*C/C++/... : C语言和数据库打交道的方法,比OCI更常用; 2) ODBC 3) OCI: C语言和...

    Oracle9i的init.ora参数中文说明

    小数分隔符用来将一个数字的整数部分与小数部分分隔开。其格式是 <decimal_character><group_separator>。 值范围: 任何单字节字符, '+', '-', ', '>' 除外。 默认值: 从 NLS_TERRITORY 中获得 nls_sort: 说明: ...

    powerbuilder

    用法在一个打印作业中,应用程序能够最多同时定义8种字体。当应用程序需要使用更多的字体时,可以在使用了某个字体号输出内容后使用PrintDefineFont()函数将该字体号对应的字体更换为其它字体。 ----------------...

    ECMAScript 2018快速入门 高清完整PDF

    内容包括变量与常量、表达式和运算符、字符串、数字和符号、数组和类型化数组、对象、函数、集合和映射、迭代器和生成器、Promise对象与异步函数、代理、类和模块,最后引导读者自己动手写一个JS框架。 [1] 目录 第...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    2. oracle11G自带一个卸载批处理\app\Administrator\product\11.2.0\dbhome_1\deinstall\deinstall.bat 3. 运行该批处理程序将自动完成oracle卸载工作,最后手动删除\app文件夹(可能需要重启才能删除) 4. 运行...

    整理后java开发全套达内学习笔记(含练习)

    宣告变量名称的同时,加上“final”关键词来限定,这个变量一但指定了值,就不可以再改变它的值 如:final int n1= 10; n1=20; 这就会报错 输出命令: System.out.println() 会自动换行的打印 System.out....

    PL/SQL Developer8.04官网程序_keygen_汉化

    如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要...

    PLSQLDeveloper下载

    如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要...

    x86 x64体系探索及编程part3

    目录 第一篇 x86 基础 第1 章数与数据类型2 1.1 数 2 1.1.1 数字 2 1.1.2 二进制数 3 1.1.3 二进制数的排列 3 1.1.4 十六进制数 5 1.1.5 八进制数与十进制数 5 1.2 数据类型 6 1.2.1 integer 数 6 1.2.2 floating-...

    x86 x64体系探索及编程part4

    目录 第一篇 x86 基础 第1 章数与数据类型2 1.1 数 2 1.1.1 数字 2 1.1.2 二进制数 3 1.1.3 二进制数的排列 3 1.1.4 十六进制数 5 1.1.5 八进制数与十进制数 5 1.2 数据类型 6 1.2.1 integer 数 6 1.2.2 floating-...

    x86 x64体系探索及编程 part2

    目录 第一篇 x86 基础 第1 章数与数据类型2 1.1 数 2 1.1.1 数字 2 1.1.2 二进制数 3 1.1.3 二进制数的排列 3 1.1.4 十六进制数 5 1.1.5 八进制数与十进制数 5 1.2 数据类型 6 1.2.1 integer 数 6 1.2.2 floating-...

    x86 x64体系探索及编程part1

    目录 第一篇 x86 基础 第1 章数与数据类型2 1.1 数 2 1.1.1 数字 2 1.1.2 二进制数 3 1.1.3 二进制数的排列 3 1.1.4 十六进制数 5 1.1.5 八进制数与十进制数 5 1.2 数据类型 6 1.2.1 integer 数 6 1.2.2 floating-...

Global site tag (gtag.js) - Google Analytics