js大写金额转数字
?1.思路:
按照億、萬(wàn)、佰、元、角、分,進(jìn)行分割處理。在億、萬(wàn)、佰、元之前數(shù)額在進(jìn)一步分割處理。如:‘叁仟肆佰伍拾億零壹佰陸拾柒萬(wàn)叁仟肆佰伍拾壹元捌角肆分’ 。
第一步是:去掉‘零’和‘整’這樣的漢字。
第二步是:拆分為:‘叁仟肆佰伍拾億,壹佰陸拾柒萬(wàn),叁仟肆佰伍拾壹元,捌角,肆分’。
第三步是:將‘叁仟肆佰伍拾億’的‘叁仟肆佰伍拾’處理為數(shù)字:‘3450’;同樣‘壹佰陸拾柒萬(wàn)’:‘167’;
‘叁仟肆佰伍拾壹’:‘3451’。
第四步:將億前面處理好的‘3450’ * 100000000;同樣‘167’*10000、‘3451’*1、8*0.1、4*0.01。
最后就是相加了:345001673451.84
2.js實(shí)現(xiàn)(輸入值是stirng類型)
這里使用正則表達(dá)式進(jìn)行單位金額的分割。getInfo()是第三步的處理函數(shù),獲取億、萬(wàn)、佰之前的金額數(shù)值。(看到這里已經(jīng)夠了,對(duì)金額精度沒(méi)有要求的夠用)
// '叁仟肆佰伍拾億零壹佰陸拾柒萬(wàn)叁仟肆佰伍拾壹元捌角伍分' => '345001673451.85' const getMoneyNum = (money) => {const dic= {零: 0,壹: 1,貳: 2,叁: 3,肆: 4,伍: 5,陸: 6,柒: 7,捌: 8,玖: 9,};// 處理仟,佰,拾;'叁仟肆佰伍拾壹' => '3451'const getInfo = (item) => {let itemCount = 0;// 將仟,佰,拾 拆分?jǐn)?shù)組 '叁仟肆佰伍拾壹' => ['叁仟', '肆佰', '伍拾', '壹']let arr = item.replace(/(\w*仟)(\w*)/, "$1,$2").replace(/(\w*佰)(\w*)/, "$1,$2").replace(/(\w*拾)(\w*)/, "$1,$2").split(',').filter(_item => {return _item && _item.trim();});// 處理每個(gè)單位對(duì)應(yīng)的值for (let subItem of arr) {let currValue = 0;let subArr = subItem.split('');if (subArr[1] === '拾') {// 處理拾位currValue = dic[subArr[0]] * 10;} else if (subArr[1] === '佰') {//處理佰位currValue = dic[subArr[0]] * 100;} else if (subArr[1] === '仟') {// 處理仟位currValue = dic[subArr[0]] * 1000;} else {// 處理個(gè)位currValue = dic[subArr[0]];}itemCount += currValue;}return itemCount;};let totalMoney = 0;// 按照億,萬(wàn),拆分成數(shù)組;'叁仟肆佰伍拾億零壹佰陸拾柒萬(wàn)叁仟肆佰伍拾壹元捌角伍分' => ['叁仟肆佰伍拾億', '壹佰陸拾柒萬(wàn)', '叁仟肆佰伍拾壹元', '捌角', '伍分']let newMoney = money.replace(/零/g, '').replace(/整/g, '') // 去掉 '零','整'.replace(/(\w*億)(\w*)/, "$1,$2").replace(/(\w*萬(wàn))(\w*)/, "$1,$2").replace(/(\w*元)(\w*)/, "$1,$2").replace(/(\w*角)(\w*)/, "$1,$2").split(',').filter(_item => {return _item && _item.trim();});// 按照億,萬(wàn)及以下單位為組, 循環(huán)求解求解數(shù)值;for (let mainItem of newMoney) {let currMoney = 0;let mainArr = mainItem.split('');if (mainArr[mainArr.length - 1] === '億') {mainArr.pop(); // 去掉億單位currMoney = getInfo(mainArr.join('')) * 100000000; // 求仟,佰,拾} else if (mainArr[mainArr.length - 1] === '萬(wàn)') {mainArr.pop(); // 去掉萬(wàn)單位currMoney = getInfo(mainArr.join('')) * 10000; // 求仟,佰,拾} else if (mainArr[mainArr.length - 1] === '元') {mainArr.pop(); // 去掉元currMoney = getInfo(mainArr.join('')); // 求仟,佰,拾} else if (mainArr[mainArr.length - 1] === '角') {mainArr.pop(); // 去掉角currMoney = dic[mainArr[0]] * 0.1;} else if (mainArr[mainArr.length - 1] === '分') {mainArr.pop(); // 去掉分currMoney = dic[mainArr[0]] * 0.01;}totalMoney += currMoney;}return totalMoney.toString(); };3.金額計(jì)算使用Decimal進(jìn)行處理
你會(huì)發(fā)現(xiàn)在代碼中用的是伍分,思路里是肆分。這就是因?yàn)閖s數(shù)值計(jì)算的誤差,經(jīng)典的題目:0.1+0.2? === 0.3 是true嗎?答案是否。所以這里使用Decimal進(jìn)行金額數(shù)值計(jì)算。下面給出的ts版本,其實(shí)和js一樣,哈哈哈哈。
// 引入Decimal yarn add decimal.js 或者 npm install decimal.js --save import { Decimal } from 'decimal.js';// 大寫(xiě)漢字轉(zhuǎn)數(shù)字;'叁仟肆佰伍拾億零壹佰陸拾柒萬(wàn)叁仟肆佰伍拾壹' => '345001673451' export const getMoneyNum = (money: string) => {// 大寫(xiě)漢字對(duì)應(yīng)的數(shù)字const dic: any = {零: 0,壹: 1,貳: 2,叁: 3,肆: 4,伍: 5,陸: 6,柒: 7,捌: 8,玖: 9,};// 處理仟,佰,拾;'叁仟肆佰伍拾壹' => '3451'const getInfo = (item: string) => {let itemCount = new Decimal(0);// 將仟,佰,拾 拆分?jǐn)?shù)組 '叁仟肆佰伍拾壹' => ['叁仟', '肆佰', '伍拾', '壹']let arr = item.replace(/(\w*仟)(\w*)/, "$1,$2").replace(/(\w*佰)(\w*)/, "$1,$2").replace(/(\w*拾)(\w*)/, "$1,$2").split(',').filter(_item => {return _item && _item.trim();});// 處理每個(gè)單位對(duì)應(yīng)的值for (let subItem of arr) {let currValue = new Decimal(0);let subArr = subItem.split('');if (subArr[1] === '拾') {// 處理拾位currValue = new Decimal(dic[subArr[0]]).mul(new Decimal(10));} else if (subArr[1] === '佰') {//處理佰位currValue = new Decimal(dic[subArr[0]]).mul(new Decimal(100));} else if (subArr[1] === '仟') {// 處理仟位currValue = new Decimal(dic[subArr[0]]).mul(new Decimal(1000));} else {// 處理個(gè)位currValue = new Decimal(dic[subArr[0]]);}itemCount = new Decimal(itemCount).add(new Decimal(currValue));}return itemCount;};let totalMoney = new Decimal(0);/*** 按照億,萬(wàn),元,角,分拆分成數(shù)組;* '叁仟肆佰伍拾億零壹佰陸拾柒萬(wàn)叁仟肆佰伍拾壹元捌角肆分' => ['叁仟肆佰伍拾億', '壹佰陸拾柒萬(wàn)', '叁仟肆佰伍拾壹元', '捌角', '肆分']*/let newMoney = money.replace(/零/g, '').replace(/整/g, '') // 去掉 '零','整'.replace(/(\w*億)(\w*)/, "$1,$2").replace(/(\w*萬(wàn))(\w*)/, "$1,$2").replace(/(\w*元)(\w*)/, "$1,$2").replace(/(\w*角)(\w*)/, "$1,$2").split(',').filter(_item => {return _item && _item.trim();});// 按照億,萬(wàn)及以下單位為組, 循環(huán)求解求解數(shù)值;for (let mainItem of newMoney) {let currMoney = new Decimal(0);let mainArr = mainItem.split('');if (mainArr[mainArr.length - 1] === '億') {mainArr.pop(); // 去掉億單位currMoney = new Decimal(getInfo(mainArr.join(''))).mul(new Decimal(100000000)); // 求仟,佰,拾} else if (mainArr[mainArr.length - 1] === '萬(wàn)') {mainArr.pop(); // 去掉萬(wàn)單位currMoney = new Decimal(getInfo(mainArr.join(''))).mul(new Decimal(10000)); // 求仟,佰,拾} else if (mainArr[mainArr.length - 1] === '元') {mainArr.pop(); // 去掉元currMoney = new Decimal(getInfo(mainArr.join(''))); // 求仟,佰,拾} else if (mainArr[mainArr.length - 1] === '角') {mainArr.pop(); // 去掉角currMoney = new Decimal(dic[mainArr[0]]).mul(new Decimal(0.1));} else if (mainArr[mainArr.length - 1] === '分') {mainArr.pop(); // 去掉分currMoney = new Decimal(dic[mainArr[0]]).mul(new Decimal(0.01));}totalMoney = new Decimal(totalMoney).add(new Decimal(currMoney));}return totalMoney.toString(); };4.去除包含其他漢字的大寫(xiě)金額字符串(如“人民幣貳佰萬(wàn)元整”得到“貳佰萬(wàn)元”)
這里用的正則表達(dá)式進(jìn)行處理的。我的業(yè)務(wù)場(chǎng)景是OCR識(shí)別營(yíng)業(yè)執(zhí)照返回的金額有“人民幣”啥的字段信息。直接上代碼。
// 去除字符串中其他文字,獲取大寫(xiě)數(shù)字金額。如“人民幣貳佰萬(wàn)元整”得到“貳佰萬(wàn)元” const getRealMoney= (value) => {const regExp = /[零壹貳叁肆伍陸柒捌玖拾佰仟萬(wàn)億元角分]/g;return value.match(regExp)?.join(''); };5.保留金額到萬(wàn)位(輸入值是stirng類型;231023310元?=>?23102.331萬(wàn)元)
這里要考慮有角分的情況,和最后幾位為零的情況。這里也主要是使用正則表達(dá)式。看代碼。
// 保留金額到萬(wàn) const getThousand = (money) => {let resReslut;const regExp = /\./g;// 有小數(shù)點(diǎn) 102321.10if (regExp.test('money')) {resReslut = money.replace(/(\d*)(\d{4}(?=\.))(\d*)/g, '$1.$2$3') // 102321.10 => 10.2321.10.replace(/(\d*)(\.)(\d*)(\.)(\d*)/, '$1$2$3$5') // 10.2321.10 => 10.232110.replace(/0*$/, '') // 去掉最后的'0' 10.232110 => 10.23211.replace(/\.$/, ''); // 去掉最后的'.'} else {// 231023310 => 23102.3310 => 23102.331resReslut = money.replace(/(\d)(\d{4}$)/, '$1.$2').replace(/0*$/, '') // 去掉最后的'0'.replace(/\.$/, ''); // 去點(diǎn)最后的'.'}return resReslut; };總結(jié)
- 上一篇: C盘减肥
- 下一篇: luogu P3966 [TJOI201