最近做的项目的一个需求,看着很简单,但实现起来还是很有意思的,于是记录下来。
只写了一百以内的,以上的自行拓展即可。
一开始我的主要思路就是把数字转换为数组下标来取出对应的汉字拼接一下,然后发现对于两位数的转化很不理想。
例如要转化22 55
,直接转化为中文的话就是二二 五五
,这显然不符合我们常用的写法。
于是加了个处理,两位数字的第一位转化为数字 + 十
,例如二二 五十五
,这下貌似是正常了。于是自信满满的提交代码,然后被测试同学给提了bug,我是百思不得其解,由于数字量不大,我一番穷举法测试下也没感觉有啥问题。
于是去找测试同学理论,他让我试了下11
然后给转成了一十一
,我乍一看好像没啥问题,然后他指了指双十一的广告道:按你这样的写法他应该是双一十一了~ 我恍然大悟一十一
这个写法乍一看没什么问题,但显然也是不符合书写习惯的,一般情况下都应该写成十一 十二 十九
这样的,把一
给略去。于是又是一番处理,终于写成了如下代码。
如需扩展代码的话还是需要再多考虑下我们的日常书写习惯。
/**
* 转化中文数字
* @param {String} num 需要转化的数字
*/
var toChinesNum = function (num) {
var changeNum = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十'],
newNum = '',
arr = num.toString().split('');
arr[0] = parseInt(arr[0]) - 1;
if (arr[0] == -1 && arr.length == 1) { return '零'; }
if (arr.length > 1) {
arr[1] = parseInt(arr[1]) - 1;
if (!arr[0]) {
newNum = !arr[0] && arr[1] == -1 ? changeNum[9] : changeNum[9] + changeNum[arr[1]];
} else {
newNum = (changeNum[arr[0]] + changeNum[9]) + (changeNum[arr[1]] ? changeNum[arr[1]] : '')
}
} else {
newNum = changeNum[arr[0]];
}
return newNum;
}