因为公司业务周期较短,时常是几个项目一块儿作,或是加上bug修复。上午的时候接到个任务,正式上的网站发现以下图的错误。 前端
找到项目中对应页面,很快发现了问题,原来以前的哥们经过定义了个数组,经过序号来取对应的中文。这样的方式缺点很明显,个数有限。致使如今出现不够用的情况。 正则表达式
通过考虑以为能够抽出一个公共的方法代码以下:数组
/**
* 根据输入的数字返回对应是中文,格式如:三十一
* @param {Number} index 序号
*/
export function covertNumberTochinese(index) {
const multiple = parseInt((index + 1) / 10)
const remainder = (index + 1) % 10
const weekheadNum = [
'一',
'二',
'三',
'四',
'五',
'六',
'七',
'八',
'九',
'十'
]
let text = ''
const textMap = new Map([
[/^1_[0-9]$/, () => `十${weekheadNum[remainder - 1]}`],
[/^1_0$/, () => `十`],
[
/^[2-9]_[1-9]$/,
() => `${weekheadNum[multiple - 1]}十${weekheadNum[remainder - 1]}`
],
[/^[2-9]_0$/, () => `${weekheadNum[multiple - 1]}十`],
[/^0_\w/, () => `${weekheadNum[remainder - 1]}`]
])
const textList = [...textMap].filter(([reg]) => {
return reg.test(multiple + '_' + remainder)
})
textList.forEach(([reg, callBack]) => {
text = callBack()
})
return text
}
复制代码
用上面的方法能够将数字匹配到中午 1-99位,虽然项目中是够用了,可是局限性仍是很大,并且判断的条件不少,逻辑不直观。浏览器
/**
* 根据输入的数字返回对应是中文,格式如:一千零一
* @param {Number|String} index 序号或者数字开头的字符串
*/
export numberToChinese(number) {
number = String(parseInt(number))
const ChineseText = '零一二三四五六七八九'
const smallUnit = '十百千'
const length = number.length
let n = length - 2
let string = ''
for (var i = 0; i < length; i++) {
let num = number.charAt(i)
string += ChineseText.charAt(num)
string += num > 0 ? smallUnit.charAt(n) : ''
n--
}
return string
}
复制代码
.charAt
方法取对应位数的中文。四位数如下
的转换,位数增长方法是相似的)拼接
的方式获得一个中文的数字,这里n表明取第几位单位也就是取smallUnit
的第几位ChineseText
中的中文获得中文的一从十开始
的而不是从个位数开始,而且.charAt(0)取的是字符串的第一位
。而且当数字为零的时候不须要单位,因此加了num > 0的限定条件。就此数字转换成中文的方法就写完了,在浏览器中打印以下 bash
/**
* 根据输入的字符串返回按照规则去零后的字符串,格式如:一千零一
* @param {string} str 中文数字 如 一千零零一
*/
export clearZero(str){
const regMiddle = /零{2}/g
const regEnd = /零?零$/
str = str.replace(regMiddle, '零')
return str.replace(regEnd, '')
}
复制代码
将 numberToChinese 函数改成以下数据结构
export numberToChinese(number) {
number = String(parseInt(number))
const ChineseText = '零一二三四五六七八九'
const smallUnit = '十百千'
const length = number.length
let n = length - 2
let string = ''
for (var i = 0; i < length; i++) {
let num = number.charAt(i)
string += ChineseText.charAt(num)
string += num > 0 ? smallUnit.charAt(n) : ''
n--
}
return clearZero(string)
}
复制代码
charAt
取数字字符串,而后经过数组去找定义好的ChineseText对应的中文,定义了一个n
来取当前位数对应的单位首先感谢你们在留言区发表本身宝贵的意见,能抛砖引玉让你们分享本身工做经验 如下代码截取 @皈依佛门小前端在留言区的评论函数
function chin(str){
let cnChar = "零壹贰叁肆伍陆柒捌玖",
partInt = '元拾佰仟万拾佰仟亿拾佰仟',
len = str.length-1,
arr = new Array((len+1)),
i=0;
str.replace(/\d/g, n => {
let b = partInt.charAt(len-i);
arr[i] = cnChar.charAt(n) + (n==='0' && '元万亿'.indexOf(b) < 0 ? '' : b);
i++;
});
return arr.join('').replace(/(零)\1+/g,'零').replace(/零(十|百|千|万|亿|元)/g, value => value.replace(/零/, ''));
}
复制代码
接下来分析下以上代码网站
数值以及单位
做为一项,最后经过
数组join
的方法所有拼接在一块儿。而后进行
去零处理
。
let b = partInt.charAt(len-i);
arr[i] = cnChar.charAt(n) + (n==='0' && '元万亿'.indexOf(b) < 0 ? '' : b)
复制代码
效果以下: ui
/**
* 根据输入的数字返回对应是中文,格式如:一千零一
* @param {Number|String} index 序号或者数字开头的字符串
*/
export numberToChinese(number) {
number = String(parseInt(number))
const ChineseText = '零一二三四五六七八九'
const unit = '十百千万十百千亿十百千'
const length = number.length
let n = length - 2
let string = ''
for (var i = 0; i < length; i++) {
let num = number.charAt(i)
let currentUnit = unit.charAt(n)
string += ChineseText.charAt(num)
// 经过下面这步至关于将字符串分割成四位一组,由于每四位都会有一个单位,因此零不可能相连超过两个了。
string +=
num === '0' && '万亿'.indexOf(currentUnit) < 0 ? '' : currentUnit
n--
}
return this.clearZero(string)
}
复制代码
/**
* 根据输入的字符串返回按照规则去零后的字符串,格式如:一千零一
* @param {string} str 中文数字 如 一千零零一
*/
export clearZero(str){
const regMiddle = /零{2}/g
const regEnd = /零?零$/
const regTen = /一十/g
str = str.replace(regMiddle, '零')
str = str.replace(regTen, '十')
return str.replace(regEnd, '')
}
复制代码