杀敌一万自损三千三千零八十的阿拉伯数字

最近负责一个语音项目,需要将用户说的数字内容转成int型数字,以便在后续代码中使用,代码运行环境是在java虚拟中执行js,找了网上现有的代码都发现只是能转一般格式的数字,如:一亿二千三百四十五万六千七百八十九,三千万零六十&
但像其他格式,就无能为力,如:
1.权字重复,如:四万万
2.数字重复:一一万,一一,二一
3.负数:负一百,零下二十
4.小数点:一万二千三百点六九
5.分数:百分之一,四又五分之四
6.阿拉伯数字和中文混用,点和&.&混用
为了解决上面的问题自己就花1天时间整理出如下代码,,说万能确实有点夸张了,但支持绝大部分格式了:
&script type=&text/javascript&&
&!--//测试用例
var strs = [
&一亿二千三百四十五万六千七百八十九&, &一万亿&, &一千亿&, &四万万&, &三千万&, &三千万零六十&, &一二三&, &一一万&,
&六千零一&, &负一百&,&一万二千三百点六九&, &零下六六点六六四&, &四又五分之四&, &百分之一&,&六十点六亿&, &两&, &两点一&,
&二千三百四十五万&, &二二三万&, &百&,&十一&, &一十一&,&二一&,&百零一&,&一百零一&,&一百一&, &一百二一&, &两万一&,
&十亿&, &十亿四万万&, &十亿零四万万&,&十万&, &百万&, &万万&, &万分之百&, &零分之一&,
&66&,&6.6&, &六点6&, &6万&,&6万六&,
&六.6&, &.6&, &点6&,
&6点&, &6.&//非法字符
for(var i=0;i&strs.i++) {
var str = strs[i];
var number = str2number(str);
console.log(&===&&+str+&=&+number);
}&/pre&&pre name=&code& class=&html&&//实际代码function str2number(chiness) {
var fuhao = 1;
if(chiness.search(/-|负|零下/) == 0) {
fuhao = -1;
chiness = chiness.replace(/-|负|零下|正|零上/, &&);
var number = 0;
//处理分数
if(chiness.indexOf(&分之&) != -1) {
var s0 = &&;
var s1 = chiness.substring(0, chiness.indexOf(&分之&));
var s2 = chiness.substring(chiness.indexOf(&分之&)+2);
if(s1.indexOf(&又&) != -1) {
s0 = s1.substring(0, s1.indexOf(&又&));
s1 = s1.substring(s1.indexOf(&又&)+1);
var n0 = chiness2num(s0);
var n1 = chiness2num(s1);
var n2 = chiness2num(s2);
if(n1 == 0) {
number = 0;
number = (n0*n1+n2) / n1;
// 处理小数点
}else if(chiness.search(/(点|\.).+/) != -1) {//中文点和英文点混用,可以根据需要删除,点不允许出现在最后
var number1 = chiness2num(chiness.substring(0,chiness.search(/点|\./)));
var number2 = chiness2num(chiness.substring(chiness.search(/点|\./)+1), 1);
if(null == number1 || undefined == number1) {
number1 = 0;
if(null == number2 || undefined == number2) {
number2 = 0;
number = parseFloat(number1+&.&+number2);
//处理一般自然数
number = chiness2num(chiness);
number = number*
function chiness2num(chiness) {
//允许混用的数字地图,可以根据需要增减
var map = {
&零&:0, &一&:1, &二&:2, &三&:3, &四&:4, &五&:5, &六&:6, &七&:7, &八&:8, &九&:9, //一般性中文数字
&两&:2,//特殊表示中文的字,根据需要可以增减:洞幺叁陆拐勾等
&0&:0, &1&:1, &2&:2, &3&:3, &4&:4, &5&:5, &6&:6, &7&:7, &8&:8, &9&:9 //数字本身,如果不允许中文混用可以删除
var units = {&亿&:, &万&:10000, &千&:1000, &百&:100, &十&:10};
if(null == num || undefined == num) {
if((null == chiness || undefined == chiness || chiness.length==0)) {
var unitmap = new Array();
var numbers = new Array();
var type = -1;
var lastUnit = 1;
for(var i=0;i&chiness.i++) {
var c = chiness[i];
if(null != map[c] && undefined != map[c]) {
var n = map[c];
if(type == 0) {
numbers[numbers.length-1] = numbers[numbers.length-1]*10+n;
numbers.push(n);
if(n==0) {
lastUnit = 1;
} else if(lastUnit&=10) {
lastUnit = lastUnit/10;
}else if(units[c]) {
if(type == 1 || (unitmap.length&0 && units[c]&unitmap[unitmap.length-1])) {
unitmap[numbers.length-1] = units[c];
for(var key in numbers) {
if(type == 1 || units[c]&=unitmap[key]) {
numbers[key] = numbers[key]*units[c];
} else if(numbers.length&0) {
unitmap[numbers.length-1] = units[c];
numbers[numbers.length-1] = numbers[numbers.length-1] * units[c];
unitmap[numbers.length] = units[c];
numbers[numbers.length] = units[c];
lastUnit = units[c];
} else {//不在上面2种情况种,表示有非数字字符,则返回0
if(type == 0 && lastUnit&1) {
numbers[numbers.length-1]=numbers[numbers.length-1]*lastU
var num = 0;
for(var i=0; i&numbers.i++) {
num += numbers[i];
拿上面代码中的测试用例实际输出内容:
===&一亿二千三百四十五万六千七百八十九=
===&一万亿=0
===&一千亿=
===&四万万=
===&三千万=
===&三千万零六十=
===&一二三=123
===&一一万=110000
===&六千零一=6001
===&负一百=-100
===&一万二千三百点六九=12300.69
===&零下六六点六六四=-66.664
===&四又五分之四=4.8
===&百分之一=0.01
===&六十点六亿=60.6
===&两点一=2.1
===&二千三百四十五万=
===&二二三万=2230000
===&百=100
===&十一=11
===&一十一=11
===&二一=21
===&百零一=101
===&一百零一=101
===&一百一=110
===&一百二一=121
===&两万一=21000
===&十亿四万万=00
===&十亿零四万万=00
===&十万=100000
===&百万=1000000
===&万分之百=0.01
===&零分之一=0
===&6.6=6.6
===&六点6=6.6
===&6万=60000
===&6万六=66000
===&六.6=6.6
===&.6=0.6
===&点6=0.6
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1077次
排名:千里之外
(1)(2)(1)(1)张老师的BLOG
&我的日志分类
My Article Sort
NEW article
&&文章中数字的规范用法
11:12:37 &
文章中数字的规范用法
&&文章评论
以下网友留言只代表其个人观点,不代表本站的观点或立场
[匿名教师]
[匿名教师]
[匿名教师]python 把用汉字表示的数字转换为阿拉伯数字 - 为程序员服务
为程序员服务
把用汉字表示的数字转换为阿拉伯数字
[Python]代码
Python语言: 把用汉字表示的数字转换为阿拉伯数字
#coding=UTF-8
#用途:把用汉字表示的数字转换为阿拉伯数字
#用法:cn2dig(汉字数字)
#作者:马踏飞燕&honeyday.&
CN_NUM = {
u'〇' : 0,
u'一' : 1,
u'二' : 2,
u'三' : 3,
u'四' : 4,
u'五' : 5,
u'六' : 6,
u'七' : 7,
u'八' : 8,
u'九' : 9,
u'零' : 0,
u'壹' : 1,
u'贰' : 2,
u'叁' : 3,
u'肆' : 4,
u'伍' : 5,
u'陆' : 6,
u'柒' : 7,
u'捌' : 8,
u'玖' : 9,
u'貮' : 2,
u'两' : 2,
CN_UNIT = {
u'十' : 10,
u'拾' : 10,
u'百' : 100,
u'佰' : 100,
u'千' : 1000,
u'仟' : 1000,
u'万' : 10000,
u'萬' : 10000,
u'兆' : 0,
def cn2dig(cn):
lcn = list(cn)
unit = 0 #当前的单位
ldig = []#临时数组
while lcn:
cndig = lcn.pop()
if CN_UNIT.has_key(cndig):
unit = CN_UNIT.get(cndig)
if unit==10000:
ldig.append('w')
elif unit==:
ldig.append('y')
elif unit==0:#标示兆位
ldig.append('z')
dig = CN_NUM.get(cndig)
dig = dig*unit
ldig.append(dig)
if unit==10:
#处理10-19的数字
ldig.append(10)
#print ldig #uncomment this line to watch the middle var.
while ldig:
x = ldig.pop()
if x=='w':
tmp *= 10000
ret += tmp
elif x=='y':
ret += tmp
elif x=='z':
ret += tmp
ret += tmp
return ret
#ldig.reverse()
#print ldig
#print CN_NUM[u'七']
if __name__ == '__main__':
#just for test
test_dig = [u'九',
u'一百二十三',
u'一千二百零三',
u'一万一千一百零一',
u'十万零三千六百零九',
u'一百二十三万四千五百六十七',
u'一千一百二十三万四千五百六十七',
u'一亿一千一百二十三万四千五百六十七',
u'一百零二亿五千零一万零一千零三十八',
u'一千一百一十一亿一千一百二十三万四千五百六十七',
u'一兆一千一百一十一亿一千一百二十三万四千五百六十七',
for cn in test_dig:
print cn2dig(cn)
您可能的代码
相关聚客文章
相关专栏文章大数的写法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
大数的写法
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 杀人一万 自损三千 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信