Last active
July 5, 2016 06:10
-
-
Save leizongmin/4653892 to your computer and use it in GitHub Desktop.
1、把中文描述的数值转换为阿拉伯数字
2、把阿拉伯数字转换为中文描述
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function toZhNumber (num) { | |
num = Number(num); | |
if (isNaN(num)) return '不是数字'; | |
var numStr = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']; | |
// 正负号 | |
if (num < 0) { | |
var sign = '负'; | |
num = 0 - num; | |
} else { | |
var sign = ''; | |
} | |
// 以亿为单位分割 | |
var toNumber = function (num) { | |
var Y = 100000000; | |
var W = 10000; | |
var mid = num / Y; | |
if (mid > 1) { | |
// 上面不能直接 mid = parseInt(num / Y), | |
// 不知道神马原因 parseInt(1e-8) = 1,会导致堆栈溢出 | |
mid = parseInt(mid); | |
var left = toNumber(mid) + '亿'; | |
var right = toNumber(num - mid * Y); | |
// 如果右边不是 X千 开头,则需要在前面加零 | |
if (right[1] !== '千') right = '零' + right; | |
return left + right; | |
} else { | |
// 以万为中点分割成两部分 | |
var mid = parseInt(num / W); | |
var toText = function (num, ling) { | |
var q = parseInt(num / 1000); | |
num = num - q * 1000; | |
var b = parseInt(num / 100); | |
num = num - b * 100; | |
var s = parseInt(num / 10); | |
num = num - s * 10; | |
var g = num; | |
// 转化为中文数字 | |
var text = numStr[q] + '千' + numStr[b] + '百' + | |
numStr[s] + '十' + numStr[g]; | |
// 把连续的多个零改为一个零 | |
text = text.replace(/零千|零百|零十/g, '零').replace(/[零]+/g, '零'); | |
// 去掉首字的零 | |
if (!ling && text[0] === '零') text = text.substr(1); | |
// 去掉末字的零 | |
if (text.substr(-1) === '零') text = text.substr(0, text.length - 1); | |
// 特殊情况,如:“一十五”转换为“十五” | |
if (text.substr(0, 2) === '一十') text = text.substr(1); | |
return text; | |
}; | |
if (mid > 0) { | |
return toText(mid) + '万' + toText(num - mid * W, true); | |
} else { | |
return toText(num); | |
} | |
} | |
}; | |
// 取整数部分的中文描述 | |
var getIntegerPart = function (num) { | |
num = parseInt(num); | |
if (num > 0) { | |
return sign + toNumber(num); | |
} else { | |
return '零'; | |
} | |
}; | |
// 判断是否包含小数部分 | |
var decimal = num - parseInt(num); | |
if (decimal > 0) { | |
decimal = decimal.toString().substr(2); | |
var text = '点'; | |
for (var i = 0; i < decimal.length; i++) { | |
text += numStr[decimal[i]]; | |
} | |
return getIntegerPart(num) + text; | |
} else { | |
return getIntegerPart(num); | |
} | |
} | |
console.log(toZhNumber(0)); | |
console.log(toZhNumber(0.12345607)); | |
console.log(toZhNumber(1)); | |
console.log(toZhNumber(505.00555650001)); | |
console.log(toZhNumber(23)); | |
console.log(toZhNumber(-23)); | |
console.log(toZhNumber(456)); | |
console.log(toZhNumber(7890)); | |
console.log(toZhNumber(405)); | |
console.log(toZhNumber(7005)); | |
console.log(toZhNumber(8501)); | |
console.log(toZhNumber(12345)); | |
console.log(toZhNumber(10001)); | |
console.log(toZhNumber(45000000)); | |
console.log(toZhNumber(70000100005)); | |
console.log(toZhNumber(12345678910)); | |
/* | |
输出: | |
零 | |
零点一二三四五六零七 | |
一 | |
五百零五点零零五五五六五零零零一零零一五九五二 | |
二十三 | |
负二十三 | |
四百五十六 | |
七千八百九十 | |
四百零五 | |
七千零五 | |
八千五百零一 | |
一万二千三百四十五 | |
一万零一 | |
四千五百万 | |
七百亿零十万零五 | |
一百二十三亿四千五百六十七万八千九百一十 | |
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function zhNumber (str) { | |
// 检查正负号 | |
if (str[0] === '负') { | |
var sign = -1; | |
str = str.substr(1); | |
} else { | |
var sign = 1; | |
} | |
// 转换为统一的字符 | |
var convertChar = function (c) { | |
switch (c) { | |
case '一': | |
case '壹': | |
return '1'; | |
case '二': | |
case '贰': | |
return '2'; | |
case '三': | |
case '叁': | |
return '3'; | |
case '四': | |
case '肆': | |
return '4'; | |
case '五': | |
case '伍': | |
return '5'; | |
case '六': | |
case '陆': | |
return '6'; | |
case '七': | |
case '柒': | |
return '7'; | |
case '八': | |
case '捌': | |
return '8'; | |
case '九': | |
case '玖': | |
return '9'; | |
case '点': | |
return '.'; | |
case '亿': | |
return '亿'; | |
case '万': | |
return '万'; | |
case '千': | |
case '仟': | |
return '千'; | |
case '百': | |
case '佰': | |
return '百'; | |
case '十': | |
case '拾': | |
return '十'; | |
// 过滤其他字符 | |
default: | |
return ''; | |
} | |
}; | |
var _str = ''; | |
str = str.trim(); | |
for (var i = 0; i < str.length; i++) { | |
_str += convertChar(str[i]); | |
} | |
str = _str; | |
// 特殊情况,比如:十五 | |
if (str[0] === '十') str = '1' + str; | |
// 小数部分 | |
var i = str.indexOf('.'); | |
if (i === -1) { | |
var decimal = 0; | |
} else { | |
var decimal = Number(str.substr(i)); | |
str = str.substr(0, i); | |
} | |
// 开始转换整数部分 | |
var ret = 0; | |
var getMid = function (c) { | |
switch (c) { | |
case '亿': | |
return 100000000; | |
case '万': | |
return 10000; | |
case '千': | |
return 1000; | |
case '百': | |
return 100; | |
case '十': | |
return 10; | |
default: | |
return 1; | |
} | |
}; | |
for (var i = 0; i < str.length; i += 2) { | |
var n = Number(str[i]); | |
var mid = getMid(str[i + 1]); | |
// 特殊情况,如: 一千万 | |
var mid2 = getMid(str[i + 2]); | |
if (mid2 > 1) i++; | |
ret += n * mid * mid2; | |
} | |
return sign * ret + decimal; | |
} | |
console.log(zhNumber('四')); | |
console.log(zhNumber('负十五')); | |
console.log(zhNumber('十五')); | |
console.log(zhNumber('十五点三五')); | |
console.log(zhNumber('二十八')); | |
console.log(zhNumber('六十')); | |
console.log(zhNumber('一百五十')); | |
console.log(zhNumber('二百八十九')); | |
console.log(zhNumber('一千二百八十九')); | |
console.log(zhNumber('二千零四百零二')); | |
console.log(zhNumber('一万五千三百二十一')); | |
console.log(zhNumber('一万零一')); | |
console.log(zhNumber('一亿二千万')); | |
console.log(zhNumber('八千亿')); | |
/* | |
输出: | |
4 | |
-15 | |
15 | |
15.35 | |
28 | |
60 | |
150 | |
289 | |
1289 | |
2402 | |
15321 | |
10001 | |
120000000 | |
800000000000 | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment