数字 金额 相关 转换

简介: 数字 金额 相关 转换

1. 前言

  1. 数字转为大写的金钱还是比较常用的
  2. 序号阿拉伯数字转汉语

2. 将数字金额转换为大写金额

toRmb: (money) => {
    //  将数字金额转换为大写金额
    var cnNums = new Array(
      "零",
      "壹",
      "贰",
      "叁",
      "肆",
      "伍",
      "陆",
      "柒",
      "捌",
      "玖"
    ); //汉字的数字
    var cnIntRadice = new Array("", "拾", "佰", "仟"); //基本单位
    var cnIntUnits = new Array("", "万", "亿", "兆"); //对应整数部分扩展单位
    var cnDecUnits = new Array("角", "分", "毫", "厘"); //对应小数部分单位
    var cnInteger = "整"; //整数金额时后面跟的字符
    var cnIntLast = "元"; //整数完以后的单位
    //最大处理的数字
    var maxNum = 999999999999999.99;
    var integerNum; //金额整数部分
    var decimalNum; //金额小数部分
    //输出的中文金额字符串
    var chineseStr = "";
    var parts; //分离金额后用的数组,预定义
    if (money === "") {
      return "";
    }
    money = parseFloat(money);
    if (money >= maxNum) {
      //超出最大处理数字
      return "超出最大处理数字";
    }
    if (money == 0) {
      chineseStr = cnNums[0] + cnIntLast + cnInteger;
      return chineseStr;
    }
    //四舍五入保留两位小数,转换为字符串
    money = Math.round(money * 100).toString();
    integerNum = money.substr(0, money.length - 2);
    decimalNum = money.substr(money.length - 2);
    //获取整型部分转换
    if (parseInt(integerNum, 10) > 0) {
      var zeroCount = 0;
      var IntLen = integerNum.length;
      for (var i = 0; i < IntLen; i++) {
        var n = integerNum.substr(i, 1);
        var p = IntLen - i - 1;
        var q = p / 4;
        var m = p % 4;
        if (n == "0") {
          zeroCount++;
        } else {
          if (zeroCount > 0) {
            chineseStr += cnNums[0];
          }
          //归零
          zeroCount = 0;
          chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
        }
        if (m == 0 && zeroCount < 4) {
          chineseStr += cnIntUnits[q];
        }
      }
      chineseStr += cnIntLast;
    }
    //小数部分
    if (decimalNum != "") {
      var decLen = decimalNum.length;
      for (var i = 0; i < decLen; i++) {
        var n = decimalNum.substr(i, 1);
        if (n != "0") {
          chineseStr += cnNums[Number(n)] + cnDecUnits[i];
        }
      }
    }
    if (chineseStr == "") {
      chineseStr += cnNums[0] + cnIntLast + cnInteger;
    } else if (decimalNum == "" || /^0*$/.test(decimalNum)) {
      chineseStr += cnInteger;
    }
    return chineseStr;
  },

3. 序号阿拉伯数字转汉语

digitaltToChinese(num) {
    var arr1 = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
    var arr2 = [
      "",
      "十",
      "百",
      "千",
      "万",
      "十",
      "百",
      "千",
      "亿",
      "十",
      "百",
      "千",
      "万",
      "十",
      "百",
      "千",
      "亿",
    ];
    if (!num || isNaN(num)) return "零";
    var english = num.toString().split("");
    var result = "";
    for (var i = 0; i < english.length; i++) {
      var des_i = english.length - 1 - i; // 倒序排列设值
      result = arr2[i] + result;
      var arr1_index = english[des_i];
      result = arr1[arr1_index] + result;
    }
    // console.log('res:', result)
    result = result.replace(/零(千|百|十)/g, "零").replace(/十零/g, "十"); // 将【零千、零百】换成【零】 【十零】换成【十】
    result = result.replace(/零+/g, "零"); // 合并中间多个零为一个零
    result = result.replace(/零亿/g, "亿").replace(/零万/g, "万"); // 将【零亿】换成【亿】【零万】换成【万】
    result = result.replace(/亿万/g, "亿"); // 将【亿万】换成【亿】
    result = result.replace(/零+$/, ""); // 移除末尾的零
    // 将【一十】换成【十】
    result = result.replace(/^一十/g, "十");
    return result;
  },

4. 金额格式化

4.1人民币基础用法

  1. Number.prototype.toLocaleString()
  2. 它会将数字格式化为具有适当千位分隔符小数点的字符串

const amount = 1234567.89;
const formattedAmount = amount.toLocaleString('zh-CN', {
  style: 'currency',
  currency: 'CNY'
});
console.log(formattedAmount); // 输出:"¥1,234,567.89"

4.2 美元以及更多配置项

const amount = 1234567.89;
const options = {
  style: 'currency',
  currency: 'USD',
  minimumFractionDigits: 2, // 最少保留小数位数
  maximumFractionDigits: 2, // 最多保留小数位数
  useGrouping: true // 使用千位分隔符
};
const formattedAmount = amount.toLocaleString('en-US', options);
console.log(formattedAmount); // 输出:"$1,234,567.89"

4.3 去掉前置金额符号

const amount = "¥1,234,567.89"; // 带有人民币符号的金额字符串
const formattedAmountWithoutSymbol = amount.replace(/¥/, ''); // 去掉人民币符号
console.log(formattedAmountWithoutSymbol); // 输出:"1,234,567.89"
  1. number.toLocaleString([locales[, options]])
  2. locales 默认为当前环境的默认地区和语言设置

参考资料


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理,如有错误,道友们一起沟通交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
相关文章
|
6月前
|
存储 安全 前端开发
利用正则表达式取出“积分:9.0/余额:103.25”里面的数字
利用正则表达式取出“积分:9.0/余额:103.25”里面的数字
45 0
|
6月前
微信和支付宝支付的金额不能超过两位小数,可以把后台超过两位小数的支付字符串修正为两位小数
微信和支付宝支付的金额不能超过两位小数,可以把后台超过两位小数的支付字符串修正为两位小数
56 0
|
6月前
如何实现后台返回的数据有.00或.0,显示时若是整数不显示小数点和小数电以后的0,小数显示小数点
如何实现后台返回的数据有.00或.0,显示时若是整数不显示小数点和小数电以后的0,小数显示小数点
70 0
|
Java
java将输入的数字金额转换为中文大写金额
java将输入的数字金额转换为中文大写金额
748 1
|
6月前
【全网最精简】一行代码解决千万位以上的数字格式化为银行金额数字格式/货币格式(如:¥1,000,000,000.00)
【全网最精简】一行代码解决千万位以上的数字格式化为银行金额数字格式/货币格式(如:¥1,000,000,000.00)
|
存储 数据库
TypeORM 实体存储数字并保留小数点后3位
在 TypeORM 中,可以使用 @Column 装饰器的 type 属性来定义实体中数字字段的数据类型,并且可以通过 scale 和 precision 属性来设置保留小数点后的位数。以下是一个示例:
318 0
用户输入数字,如果数字小于10,则在前面补0,比如01,09,如果数字大于10,则不需要补,比如 20
用户输入数字,如果数字小于10,则在前面补0,比如01,09,如果数字大于10,则不需要补,比如 20
158 0
关于Java转换金额数字为大写金额
关于Java转换金额数字为大写金额 目前只写到万亿
|
测试技术
【解决方案 二十三】带单位的数值转大写人民币金额
【解决方案 二十三】带单位的数值转大写人民币金额
110 0
|
算法 Python
一日一技:如何统计一个数字的二进制值里面有多少个1
一日一技:如何统计一个数字的二进制值里面有多少个1
240 0