前端金额转换为人民币大写(5种方法)

当涉及到前端的财务模块有关的时候,比如列表展示、导出、打印发票报表等场景时,我们需要把金额转换为人民币大写

比如:数字:108.12 => 人民币大写:壹佰零捌元壹角贰分

亿
亿

这里有5种常见的方法,逐一介绍如下:

1.递归转换法:


这是一种比较复杂的方法,在每一个单位级别都需要进行递归转换。流程如下:

function convertToRMB(amount) {
    const units = ['元', '十', '百', '千', '万', '十万', '百万', '千万', '亿', '十亿', '百亿', '千亿'];
    const digits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
  
    function convert(num) {
        if (num === 0) {
            return '';
        }
  
        let str = '';
  
        if (num < 10) {
            str = digits[num];
        } else if (num < 20) {
            str = '十' + digits[num - 10];
        } else if (num < 100) {
            str = digits[Math.floor(num / 10)] + '十' + digits[num % 10];
        } else {
            str = digits[Math.floor(num / 100)] + '百' + convert(num % 100);
        }
  
        return str;
    }
  
    const [integerPart, decimalPart] = String(amount).split('.');
    const integerInRMB = convert(parseInt(integerPart));
  
    let result = integerInRMB + '元';
  
    if (decimalPart) {
        result += decimalPart.split('').map(digit => digits[digit]).join('') + '角';
    }
  
    return result;
}

console.log(convertToRMB(108.12));  //壹百捌元壹贰角


2.查表转换法:


这种方法相对简单,事先准备好一个金额与大写的对应表。流程如下:
将金额转换为字符串,并按位拆分为一个数组。
从高位到低位,根据数组中的每一位查表并拼接对应的大写数字(例如0-9对应的大写数字为"零"、“壹”、"贰"等)。
根据小数点位置,对整数部分和小数部分进行拼接。

function convertToRMB(amount) {
    const digits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
    const units = ['', '拾', '佰', '仟', '万', '拾万', '佰万', '仟万', '亿', '拾亿', '佰亿', '仟亿'];

    const [integerPart, decimalPart] = String(amount).split('.');
    const integerDigits = integerPart.split('').map(digit => digits[parseInt(digit)]);
  
    let result = '';
  
    for (let i = 0; i < integerDigits.length; i++) {
        result += integerDigits[i] + units[integerDigits.length - 1 - i];
    }
  
    if (decimalPart) {
        const decimalDigits = decimalPart.split('').map(digit => digits[parseInt(digit)]);
        result += '点' + decimalDigits.join('');
    }
  
    return result;
}

console.log(convertToRMB(108.12));  //壹佰零拾捌点壹贰


3.数学计算法:


这种方法相比前两种方法更简洁,通过数学计算直接得出结果。流程如下:
将金额保留两位小数,并转换为数值型。
获取整数部分和小数部分。
将整数部分进行数学计算得到相应的大写数字。
将小数部分转换为对应的大写数字。

function convertToRMB(amount) {
    const digits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];

    const [integerPart, decimalPart] = String(amount.toFixed(2)).split('.');
    const integerDigits = integerPart.split('').map(digit => digits[parseInt(digit)]);
  
    let result = '';
  
    for (let i = 0; i < integerDigits.length; i++) {
        result += integerDigits[i];
    }
  
    if (decimalPart) {
        const decimalDigits = decimalPart.split('').map(digit => digits[parseInt(digit)]);
        result += '点' + decimalDigits.join('');
    }
  
    return result;
}

console.log(convertToRMB(108.12));  //壹零捌点壹贰


4.第3方库的使用:


这是最简单的方法,通过使用前端开发中已经存在的金额转换函数库来实现。流程如下:
在前端项目中引入合适的金额转换函数库。
调用相应的函数传入金额参数,即可得到转换结果。但是呢需要下包,常言鱼与熊掌不可兼得
 

4.1安装number-to-chinese-words

npm install number-to-chinese-words
 使用:
var converter = require('number-to-chinese-words');
converter.toOrdinal(108.12);

将数字转为文字:toWords(number)  

// 整數:
var converter = require('number-to-chinese-words');
converter.toWords(13); // => “十三”
 
// Decimal numbers:
converter.toWords(2.9); // => “二點九”
 
// Negative numbers:
converter.toWords(-3); // => "負三"
 
// Large numbers:
converter.toWords(9007199254740992); // => “九千零七兆一千九百九十二億五千四百七十四萬零九百九十二

将整数转换成文字:toWordsOrdinal(number)

但是会在原来的基础上再加上前置的「第」字。 如果输入的数字包含小数点,小数点后的数目将会被移除。

import converter from "number-to-chinese-words";

converter.toWordsOrdinal(21); // => “第二十一”

 转大写:

var converter = require("number-to-chinese-words")
converter.default.labels = Object.assign({},converter.default.labels, {
  digits : ['零','壹', '貳', '參', '肆', '伍', '陸', '柒', '捌', '玖'],
  units: ['','拾', '佰', '仟', '萬', '拾', '佰', '仟', '億', '拾', '佰', '仟', '兆', '拾', '佰', '仟', '京', '拾', '佰', '仟', '垓']
})
 
converter.toWords(199254740992); 
// => 壹仟玖佰玖拾貳億伍仟肆佰柒拾肆萬零玖佰玖拾貳

 4.2、安装pixiu-number-toolkit(推荐)

pixiu-number-toolkit是一个用TypeScript编写的数字工具集,提供了一组用于数字转换、财务计算、格式化和数学运算的函数。其中就包含了一个名为digitUppercase的函数,可以将数字金额转换为大写的人民币汉字表示。

安装
npm install pixiu-number-toolkit
使用digitUppercase函数进行转换:
import { digitUppercase } from "pixiu-number-toolkit";

const amount = 1234.56;
const result = digitUppercase(amount);

console.log(result);
// 输出: "壹仟贰佰叁拾肆元伍角陆分"

这个函数还可以处理负金额,在结果前加上“欠”。零金额表示为“零元整”。

5.还有一种(推荐):

function transformStr(money) {
  var cnMoney = "零元整";
    var strOutput = "";
    var strUnit = '仟佰拾亿仟佰拾万仟佰拾元角分';
    money += "00";
    var intPos = money.indexOf('.');
    if (intPos >= 0) {
       money = money.substring(0, intPos) + money.substr(intPos + 1, 2);
    }
    strUnit = strUnit.substr(strUnit.length - money.length);
    for (var i = 0; i < money.length; i++) {
       strOutput += '零壹贰叁肆伍陆柒捌玖'.substr(money.substr(i, 1), 1) + strUnit.substr(i, 1);
    }
    cnMoney = strOutput.replace(/零角零分$/, '整').replace(/零[仟佰拾]/g, '零').replace(/零{2,}/g, '零').replace(/零([亿|万])/g, '$1').replace(/零+元/, '元').replace(/亿零{0,3}万/, '亿').replace(/^元/, "零元");
    return cnMoney;
}

// 108.12 => 壹佰零捌元壹角贰分

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
<script type="text/javascript"> function CheckAlls(checked) { len = document.frmmain.elements.length; var i=0; for( i=0; i<len; i++) { if (document.frmmain.elements[i].name=='check_node_0') { if(document.frmmain.elements[i].disabled == false){ document.frmmain.elements[i].checked=(checked==true?true:false); } } } } </script><script> document.onpropertychange= function() { var a= document.getElementById('field6163').value;//取小写金额的值 var numberValue=new String(Math.round(a*100)); // 数字金额 var String1 = "零壹贰叁肆伍陆柒捌玖"; // 汉字数字 var String2 = "万仟佰拾亿仟佰拾万仟佰拾元角分"; // 对应单位 var len=numberValue.length; // numberValue 的字符串长度 //alert(len); var Ch1; // 数字的汉语读法 var Ch2; // 数字位的汉字读法 var nZero=0; // 用来计算连续的零值的个数 var String3; // 指定位置的数值 { if(len>15){ alert("超出计算范围"); return fase; } if (numberValue==0){ chineseValue = "零元整"; } else { chineseValue=""; } String2 = String2.substr(String2.length-len, len); // 取出对应位数的STRING2的值 for(var i=0; i<len; i++){ String3 = parseInt(numberValue.substr(i, 1),10); // 取出需转换的某一位的值 if ( i != (len - 3) && i != (len - 7) && i != (len - 11) && i !=(len - 15) ){ if ( String3 == 0 ){ Ch1 = ""; Ch2 = ""; nZero = nZero + 1; } else if ( String3 != 0 && nZero != 0 ){ Ch1 = "零" + String1.substr(String3, 1); Ch2 = String2.substr(i, 1); nZero = 0; } else{ Ch1 = String1.substr(String3, 1); Ch2 = String2.substr(i, 1); nZero = 0; } } else{ // 该位是万亿,亿,万,元位等关键位 if( String3 != 0 && nZero != 0 ){ Ch1 = "零" + String1.substr(String3, 1); Ch2 = String2.substr(i, 1); nZero = 0; } else if ( String3 != 0 && nZero == 0 ){ Ch1 = String1.substr(String3, 1); Ch2 = String2.substr(i, 1); nZero = 0; } else if( String3 == 0 && nZero >= 3 ){ Ch1 = ""; Ch2 = ""; nZero = nZero + 1; } else{ Ch1 = ""; Ch2 = String2.substr(i, 1); nZero = nZero + 1; } if( i == (len - 11) || i == (len - 3)){ // 如果该位是亿位或元位,则必须写上 Ch2 = String2.substr(i, 1); } } chineseValue =chineseValue +Ch1 + Ch2; } if ( String3 == 0 ){ // 最后一位(分)为0时,加上“整” chineseValue = chineseValue + "整"; } } //alert(chineseValue); document.getElementById('field6421').value=chineseValue; } </script>
您可以使用MySQL中的自定义函数来将金额转换为汉字大写。以下是一个示例的MySQL函数,可以实现将金额转换为汉字大写的功能: ```sql DELIMITER $$ CREATE FUNCTION num_to_rmb(IN num DECIMAL(18, 2)) RETURNS VARCHAR(255) BEGIN DECLARE result VARCHAR(255); DECLARE integer_part INT; DECLARE decimal_part INT; DECLARE temp VARCHAR(255); SET result = ''; SET integer_part = FLOOR(num); SET decimal_part = ROUND((num - integer_part) * 100); IF integer_part = 0 THEN SET result = '零元'; ELSE SET temp = ''; IF integer_part >= 100000000 THEN SET temp = CONCAT(temp, num_to_rmb(FLOOR(integer_part / 100000000)), '亿'); SET integer_part = integer_part % 100000000; END IF; IF integer_part >= 10000 THEN SET temp = CONCAT(temp, num_to_rmb(FLOOR(integer_part / 10000)), '万'); SET integer_part = integer_part % 10000; END IF; IF integer_part >= 1000 THEN SET temp = CONCAT(temp, num_to_rmb(FLOOR(integer_part / 1000)), '仟'); SET integer_part = integer_part % 1000; END IF; IF integer_part >= 100 THEN SET temp = CONCAT(temp, num_to_rmb(FLOOR(integer_part / 100)), '佰'); SET integer_part = integer_part % 100; END IF; IF integer_part >= 10 THEN SET temp = CONCAT(temp, num_to_rmb(FLOOR(integer_part / 10)), '拾'); SET integer_part = integer_part % 10; END IF; IF integer_part > 0 THEN SET temp = CONCAT(temp, num_to_rmb(integer_part)); END IF; SET result = CONCAT(temp, '元'); END IF; IF decimal_part = 0 THEN SET result = CONCAT(result, '整'); ELSE IF decimal_part >= 10 THEN SET result = CONCAT(result, num_to_rmb(FLOOR(decimal_part / 10)), '角'); SET decimal_part = decimal_part % 10; END IF; IF decimal_part > 0 THEN SET result = CONCAT(result, num_to_rmb(decimal_part), '分'); END IF; END IF; RETURN result; END$$ DELIMITER ; ``` 创建完上述函数后,您可以使用以下方式将金额转换为汉字大写: ```sql SELECT num_to_rmb(12345.67) AS rmb_amount; ``` 该查询将返回"壹万贰仟叁佰肆拾伍元陆角柒分",表示金额为12345.67的汉字大写形式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

じòぴé南冸じょうげん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值