Skip to content

Instantly share code, notes, and snippets.

@leizongmin
Last active July 5, 2016 06:10
Show Gist options
  • Save leizongmin/4653892 to your computer and use it in GitHub Desktop.
Save leizongmin/4653892 to your computer and use it in GitHub Desktop.
1、把中文描述的数值转换为阿拉伯数字 2、把阿拉伯数字转换为中文描述
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));
/*
输出:
零点一二三四五六零七
五百零五点零零五五五六五零零零一零零一五九五二
二十三
负二十三
四百五十六
七千八百九十
四百零五
七千零五
八千五百零一
一万二千三百四十五
一万零一
四千五百万
七百亿零十万零五
一百二十三亿四千五百六十七万八千九百一十
*/
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