JavaScript实现阿拉伯数字与中文数字互相转换

何川
何川
发布时间:2026-10-13 | 2人浏览过
原创

在涉及金额展示或传统文本处理的场景中,常需进行数字格式转换。本文将深入解析阿拉伯数字与中文数字互转的核心逻辑,涵盖中文数字的权位划分与零的处理规则,并提供完整的JavaScript转换算法实现,助您快速掌握这一实用技能。

阿拉伯数字转中文数字:规则与实现

将阿拉伯数字转换为中文数字并非简单的字符替换,而是需要遵循特定的计数单位和语法规则。理解这些规则是编写正确算法的前提。

第1步:理解中文数字的结构规则

中文数字具有层级结构,主要特点如下:

  • 计数数字与权位:每个数值数字后通常跟随一个权位,常见的权位有“十”、“百”、“千”、“万”、“亿”。
  • 小节与节权位:以“万”为一个小节,对应节权位;万以下的小节(个、十、百、千)没有独立的节权位,依靠“十百千”独立计数。
  • 权位连用限制:“十、百、千”不能连续出现(如不能说“二三百四”),而“万”和“亿”作为节权位时,可以与其他权位连用(如“二十亿”)。

第2步:掌握“零”的使用规则

中文数字对“零”的使用有严格的三条规则,算法必须准确体现这些逻辑:

  • 小节结尾不补零:以10000为小节,如果小节的末尾是0(如1200),在输出时不需要加“零”,因为后面的权位(万)已经起到了衔接作用。
  • 中间间隔必补零:在小节内部,如果两个非零数字之间有0(如105,读作“一百零五”),必须使用“零”连接。
  • 高位空缺补零:当一个小节的“千”位是0(即该小节数值在1~999之间),且它不是最高的小节(即后面还有更大的单位如“万”),则需要在前一小节后补“零”。例如:10001 应读作 “一万零一”。

第3步:设计基础数据映射

为了提高转换效率,我们使用数组来存储中文数字字符和单位字符。算法设计中,检测“零”的逻辑被放置在循环最前面并默认为false,这样可以自然丢弃最高小节的加零判断。

// 单个数字转换数组
var chnNumChar = ["零","一","二","三","四","五","六","七","八","九"];

// 节权位数组(万、亿等)
var chnUnitSection = ["","万","亿","万亿","亿亿"];

// 节内权位数组(十、百、千)
var chnUnitChar = ["","十","百","千"];

第4步:实现节内转换函数

首先处理每个小节(最多4位数,即0-9999)内部的转换。逻辑是遍历每一位,处理数字和权位的组合,并正确插入“零”。

function SectionToChinese(section){
  var strIns = '', chnStr = '';
  var unitPos = 0;
  var zero = true; // 标记前一位是否为0或是否需要补零

  while(section > 0){
    var v = section % 10; // 取当前最低位
    if(v === 0){
      // 如果是0
      if(!zero){
        zero = true;
        chnStr = chnNumChar[v] + chnStr; // 插入一个零,但稍后可能因规则被覆盖或调整,此处为中间状态处理
      }
    }else{
      zero = false;
      strIns = chnNumChar[v];
      strIns += chnUnitChar[unitPos]; // 加上对应的权位,如“十”、“百”
      chnStr = strIns + chnStr;
    }
    unitPos++;
    section = Math.floor(section / 10); // 移除已处理的位
  }
  // 注意:此函数返回的是包含潜在冗余字符的中间串,实际完整逻辑需在主函数中处理节间关系
  return chnStr;
}

第5步:实现主转换函数

主函数负责处理不同小节之间的拼接,特别是处理“万”和“亿”的节权位,以及根据前述“零”的规则添加必要的“零”。

function NumberToChinese(num){
  var unitPos = 0;
  var strIns = '', chnStr = '';
  var needZero = false; // 标记上一小节处理后,本小节前是否需要补零

  if(num === 0){
    return chnNumChar[0];
  }

  while(num > 0){
    var section = num % 10000; // 取出低四位作为一个小节
    
    // 如果需要补零(根据规则3),先插入零
    if(needZero){
      chnStr = chnNumChar[0] + chnStr;
    }
    
    // 处理当前小节内部
    strIns = SectionToChinese(section);
    
    // 只有当小节不为0时,才添加节权位(万、亿等);若小节为0,则不加节权位也不加零(由needZero控制后续)
    strIns += (section !== 0) ? chnUnitSection[unitPos] : "";
    chnStr = strIns + chnStr;
    
    // 判断下一轮循环(更高位的小节)前是否需要补零
    // 规则:如果当前小节小于1000且大于0,说明高位有值而低位缺千位,需补零
    needZero = (section < 1000) && (section > 0);
    
    num = Math.floor(num / 10000); // 移动到高四位
    unitPos++;
  }

  return chnStr;
}

中文数字转阿拉伯数字:原理与实现

反向转换的核心思想是将中文文字解析为数值和权位,计算每位代表的实际大小并求和。零在这里可以直接忽略,因为它不影响数值累加,只影响权位的定位。

第1步:准备数值与权位映射对象

定义两个对象,分别用于快速获取中文数字对应的阿拉伯数值,以及中文权位对应的具体数值和是否为节权位(万、亿)的标志。

// 中文数字字符到数值的映射
var chnNumChar = {
  '零':0, '一':1, '二':2, '三':3, '四':4,
  '五':5, '六':6, '七':7, '八':8, '九':9
};

// 中文权位映射:value为倍数,secUnit表示是否为节权位(万/亿)
var chnNameValue = {
  '十': {value: 10, secUnit: false},
  '百': {value: 100, secUnit: false},
  '千': {value: 1000, secUnit: false},
  '万': {value: 10000, secUnit: true},
  '亿': {value: 100000000, secUnit: true}
};

第2步:实现解析与求和算法

遍历字符串,识别数字和权位。遇到数字时暂存;遇到权位时,根据是否是节权位来决定如何累加。节权位会将之前的累积结果放大并归入总结果,而非节权位则直接累加到当前小节。

function ChineseToNumber(chnStr){
  var rtn = 0;    // 最终返回的整数结果
  var section = 0; // 当前小节的累计值
  var number = 0;  // 当前读取到的数字
  var secUnit = false; // 当前遇到的权位是否是节权位
  
  var str = chnStr.split(''); // 将字符串拆分为字符数组

  for(var i = 0; i < str.length; i++){
    var charVal = chnNumChar[str[i]];
    
    if(typeof charVal !== 'undefined'){
      // 如果当前字符是数字
      number = charVal;
      if(i === str.length - 1){
        // 如果这是最后一个字符,直接将数字加入当前小节
        section += number;
      }
    }else{
      // 如果当前字符是权位(十、百、千、万、亿)
      var unitInfo = chnNameValue[str[i]];
      var unit = unitInfo.value;
      secUnit = unitInfo.secUnit;
      
      if(secUnit){
        // 是节权位(万、亿):先将之前累积的小节数加上当前数字,再乘以权位值,最后加到总结果rtn中
        section = (section + number) * unit;
        rtn += section;
        section = 0; // 重置小节累加器
      }else{
        // 是非节权位(十、百、千):直接将 数字*权位 的值加到当前小节section中
        section += (number * unit);
      }
      number = 0; // 重置数字临时变量
    }
  }
  
  // 返回总结果加上最后剩余的小节值
  return rtn + section;
}

总结与应用建议

通过上述算法,我们可以实现高精度的阿拉伯数字与中文数字互转。在实际开发中,建议对输入进行预处理(如去除空格、检查非法字符),并对边界情况(如0、负数、极大数字)进行额外测试和优化。特别是在金融类应用中,务必确保所有金额的汉字表示符合国家标准规范。

以上就是JavaScript实现阿拉伯数字与中文数字互相转换的详细内容,更多关于JavaScript数字处理、前端算法优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表