針對財務數據將金額數據轉換成大寫,在網上有不少例子,總感受有更簡單的方式實現,下面是具體的源碼和探究。若是疑問,或更好的建議歡迎留言,共同窗習。學習
class NumToZh_cn { numLevel = [ "", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億", "拾", "佰", "仟", "萬", "拾", "佰", "仟", "億" ] currencyUnit = [ '角', '分' ] numMapToCh = { '0': '零', '1': '壹', '2': '貳', '3': '叄', '4': '肆', '5': '伍', '6': '陸', '7': '柒', '8': '捌', '9': '玖' } _test( arr, item, index ){ const unit = this.numLevel[ arr.length - index - 1 ]; return item === '0' ? /(萬|億)/.test(unit) ? unit : '零' : this.numMapToCh[ item ] + unit; } _dataIntHandle( arr ){ return arr.map( ( item, index ) => this._test(arr, item, index ) ) .join('') .replace(/零+/g, '零' ) .replace(/零$/,'') + '元'; } _dataDeciHandle( arr ){ return arr.map( ( item, index ) => item === '0' ? '' : this.numMapToCh[ item ] + this.currencyUnit[ index ] ).join(''); } convert( numStr ){ numStr = '' + numStr; if( !/^\d+(\.\d+)?$/.test( numStr.trim() ) ) throw 'param is not number'; const [ x='', y='' ] = numStr.split('.'); return this._dataIntHandle( x.split('') ) + this._dataDeciHandle( y.split('') ) + '整'; } } const numToZh_cn = new NumToZh_cn(); export { NumToZh_cn }
經過 num 與中文的映射實現,避免了傳統的循環遍歷的實現方式。目前支持持17位數,若是更大的數據可進行修正。this
numToZh_cn( 100400 ) // 壹拾萬零肆佰零元整