js 数字金额转为大写 js 金额转大写

一、金额转大写文字

javascript 复制代码
ChineseWords.js文件

const ChineseWords = (value) => {
  return currencyToChinese(value, {
    currency: false
  })
}

const CN_NUMBERS = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
const CN_UNITS = ['', '拾', '佰', '仟'];
const CN_SECTION_UNITS = ['', '万', '亿', '万亿'];
const CN_DECIMAL_UNITS = ['角', '分'];

/**
 * 将金额转换为中文
 * @param {number|string} amount 金额,可以是数字或字符串
 * @param {object} options 选项对象
 * @param {boolean} options.currency 是否添加人民币字样
 * @returns {string} 中文金额表示
 */
const currencyToChinese = (
  amount,
  options
) => {
  if (amount === null || amount === undefined || amount === '') {
    return options.currency ? '人民币零元整' : '零元整';
  }

  // 转换为数字并验证
  const num = typeof amount === 'string' ? parseFloat(amount.replace(/,/g, '')) : amount;

  if (isNaN(num)) {
    throw new Error('无效的金额格式');
  }

  if (Math.abs(num) >= 999999999999.99) {
    throw new Error('金额超出处理范围(最大支持9999亿)');
  }

  // 处理负数
  const isNegative = num < 0;
  const absAmount = Math.abs(num);

  // 分离整数和小数部分
  const [integerPart, decimalPart] = absAmount.toFixed(2).split('.');

  let result = '';

  // 处理整数部分
  if (integerPart !== '0') {
    result += convertInteger(integerPart);
  }

  // 处理小数部分
  if (decimalPart && decimalPart !== '00') {
    if (result) {
      result += '元';
    }
    result += convertDecimal(decimalPart);
  } else {
    if (result) {
      result += '元整';
    } else {
      result = '零元整';
    }
  }

  // 添加人民币字样
  if (options.currency) {
    result = '人民币' + result;
  }

  // 添加负号
  if (isNegative) {
    result = '负' + result;
  }

  return result;
}

/**
 * 将整数转换为中文
 * @param {string} integerStr 整数字符串
 */
const convertInteger = (integerStr) => {
  const num = parseInt(integerStr, 10);
  if (num === 0) return '';

  let result = '';
  const str = num.toString();
  const len = str.length;
  let zeroCount = 0;

  for (let i = 0; i < len; i++) {
    const n = parseInt(str[i], 10);
    const pos = len - i - 1;
    const section = Math.floor(pos / 4);
    const unitPos = pos % 4;

    if (n === 0) {
      zeroCount++;
    } else {
      if (zeroCount > 0) {
        result += '零';
        zeroCount = 0;
      }
      result += CN_NUMBERS[n] + CN_UNITS[unitPos];
    }

    // 处理万、亿等单位
    if (unitPos === 0 && section > 0) {
      if (zeroCount < 4) {
        result += CN_SECTION_UNITS[section];
      }
      zeroCount = 0;
    }
  }
  return result;
}

/** 
 * 将小数部分转换为中文
 * @param {string} decimalStr 小数字符串
*/
const convertDecimal = (decimalStr) => {
  let result = '';

  for (let i = 0; i < decimalStr.length && i < 2; i++) {
    const n = parseInt(decimalStr[i], 10);
    if (n !== 0) {
      result += CN_NUMBERS[n] + CN_DECIMAL_UNITS[i];
    }
  }
  return result || '';
}
/** 
 * 将金额转换为中文
 * @param {number|string} amount 金额,可以是数字或字符串
*/
const amountToChinese = (amount) => {
  return currencyToChinese(amount, { currency: false });
}
/**
 * 验证金额是否有效
 * @param {number|string} amount 金额,可以是数字或字符串
 * @returns {boolean} 是否有效
 */
const validateAmount = (amount) => {
  if (amount === null || amount === undefined || amount === '') {
    return false;
  }

  const num = typeof amount === 'string' ? parseFloat(amount.replace(/,/g, '')) : amount;
  return !isNaN(num) && Math.abs(num) < 999999999999.99;
}

/**
 * 格式化金额
 * @param {number|string} amount 金额,可以是数字或字符串
 * @returns {string} 格式化后的金额
 */
const formatAmount = (amount) => {
  if (amount === null || amount === undefined || amount === '') {
    return '0.00';
  }

  const num = typeof amount === 'string' ? parseFloat(amount.replace(/,/g, '')) : amount;
  if (isNaN(num)) return '0.00';

  return num.toLocaleString('zh-CN', {
    minimumFractionDigits: 2,
    maximumFractionDigits: 2
  });
}
export default ChineseWords

二、页面中使用

javascript 复制代码
import ChineseWords from "@/views/ChineseWords.js"; // 转大写文字js
// 监听汇款金额输入,实时转换为大写
const handleAmountInput = () => {
  // 转换为大写并赋值
  ruleForm.value.amountUpper = ChineseWords(amount);
};
相关推荐
weixin_493503674 小时前
Vue3 前端生成 PDF:会员证书与活动签到表的三种打印方案与踩坑记录
前端·pdf·状态模式
傻啦嘿哟4 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670794 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
李少兄5 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh5 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
Tangyuewei6 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界6 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
尾善爱看海7 小时前
前端算法与手写题集
前端·算法
徐小夕7 小时前
JitWord 4.0 万字分享:从协同工具到AI Word操作系统,聊聊3年产品创业史
前端·vue.js·后端
繁星蓝雨7 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进