將數字用中文讀取出來

數字轉換成中文

針對財務數據將金額數據轉換成大寫,在網上有不少例子,總感受有更簡單的方式實現,下面是具體的源碼和探究。若是疑問,或更好的建議歡迎留言,共同窗習。學習

源碼

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 ) // 壹拾萬零肆佰零元整
相關文章
相關標籤/搜索