您的位置:

JavaScript实现数字转大写

JavaScript作为一门广泛使用的脚本编程语言,具有广泛的表现力和语义化,被广泛用于开发Web应用程序。它可以被用来完成许多任务,其中之一是将数字转化为大写的汉字。本文将从多个方面讨论如何在JavaScript中实现数字转大写的功能。

一、js数字转大写汉字

此功能实现的核心思路是将数字按照一定的规则进行转换,如对每个数字单元进行处理,再根据数字位数添加对应的单位汉字等。

以下是示范代码:

function numberToChinese(num) {
  var digit = '零一二三四五六七八九';
  var unit = [ '十','百','千','万','亿'];
  var s = num.toString();
  var len = s.length;
  var result = '';
  for(var i = 0; i < len; i++){
    var index = len - i - 1;
    var current = digit[parseInt(s[index])];
    var next = digit[parseInt(s[index - 1])] || '';
    if(current === '零' && next === '零') continue;
    if(current === '零') current = '';
    if(index === 0 && current === '一') current = '';
    result = current + unit[i % 4] + result;
    if(index % 4 ===0) result = unit[Math.floor(i / 4) + 3] + result;
  }
  return result;
}

console.log(numberToChinese(12345)); //一万二千三百四十五

示例代码中定义了数字的汉字表示法,将数字单元与单位进行拼接即可得到中文大写表示。通过该函数,可以将任意长度的阿拉伯数字转换为中文大写形式。

二、js数字转中文大写

与js数字转大写类似,js数字转中文大写也是一个常见需求,这需要我们将数字转换成中文大写,以便于在一些场合(如合同、票据)中使用。

以下是示范代码:

function toChineseNum(num){
  if(!/^\d*(\.\d*)?$/.test(num)){
    return "非数字!";
  }
  var cnNums = ["零","一","二","三","四","五","六","七","八","九"];
  var cnIntRadice = ["","十","百","千"];
  var cnIntUnits = ["","万","亿","万亿"];
  var cnDecUnits = ["角","分"];
  var cnInteger = "整";
  var cnStr = "";
  var parts;
  var zeroCount;
  if(num === ""){
    return "零";
  }
  num = parseFloat(num);
  if(num >= 1 && num <= 999999999999.99){
    var isNegative = false;
    if(num < 0){
      isNegative = true;
      num = -num;
    }
    num = num.toFixed(2);
    if(num.indexOf(".") === -1){
      parts = [num, ""];
    }else{
      parts = num.toString().split(".");
    }
    if(parseInt(parts[0],10) > 0){// 整数部分
      zeroCount = 0;
      var intLen = parts[0].length;
      for(var i=0;i 0){
            cnStr += cnNums[0];
          }
          zeroCount = 0; //归零
          cnStr += cnNums[parseInt(n)]+cnIntRadice[m];
        }
        if(m === 0 && zeroCount < 4){
          cnStr += cnIntUnits[q];
          zeroCount = 0;
        }
      }
      cnStr += cnInteger;
    }
    if(cnStr === ""){
      cnStr += cnNums[0]+cnInteger;
    }   
    if(parts[1] && parseFloat(parts[1]) > 0){//小数部分
      var decLen = parts[1].length;
      for(var j=0;j
   


    

以上代码中用到了数组和条件判断语句,拼接各自部分得到汉字大写形式。注意:仅仅是将数字转换为中文大写形式,输出时不考虑符号位。

三、js数字转大写金额

js数字转大写金额是一道被一些面试官喜欢挑的题目。其主要思路是将数字的整数部分和小数部分分别转换为大写汉字形式,然后拼接起来即可。同时,为了保证输出的金额形式的正确性,也需要一些处理。

以下是示范代码:

function convertCurrency(money) {
  //汉字的数字
  var cnNums = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
  //基本单位
  var cnIntRadice = ["", "拾", "佰", "仟"];
  //对应整数部分扩展单位
  var cnIntUnits = ["", "万", "亿", "兆"];
  //对应小数部分单位
  var cnDecUnits = ["角", "分", "毫", "厘"];
  //整数金额时后面跟的字符
  var cnInteger = "元";
  //输出的中文金额字符串
  var cnMoney = "";
  //小数部分
  var cnDec = "";
  //分离金额后用的数组,预定义
  var parts;
  if (money == "") {
    return "";
  }
  money = parseFloat(money);
  if (money >= 999999999999.99) {
    return "超出范围值";
  }
  if (money == 0) {
    cnMoney = cnNums[0] + cnInteger;
    return cnMoney;
  }
  //转换为字符串
  money = money.toString();
  if (money.indexOf(".") == -1) {
    parts = [money, ""];
  } else {
    parts = money.split(".");
  }
  //整数部分
  var integerNum = parts[0];
  //小数部分
  var decimalNum = parts[1];
  //小数部分去0
  if (decimalNum == "0") {
    cnDec = cnNums[0];
  } else {
    var decLen = decimalNum.length;
    for (var i = 0; i < decLen; i++) {
      var dec = decimalNum.substr(i, 1);
      if (dec != "0") {
        cnDec += cnNums[Number(dec)] + cnDecUnits[i];
      }
    }
  }
  //整数部分处理
  var intLen = integerNum.length;
  for (var i = 0; i < intLen; i++) {
    var num = integerNum.substr(i, 1);
    var p = intLen - i - 1;
    var q = p / 4;
    var m = p % 4;
    if (num == "0") {
      if (m == 0 && cnMoney.indexOf(cnIntUnits[q]) == -1) {
        cnMoney += cnIntUnits[q];
      }
    } else {
      var cnChar = cnNums[parseInt(num)];
      if (m == 0 && q > 0) {
        cnMoney += cnIntUnits[q];
      }
      cnMoney += cnChar;
      cnMoney += cnIntRadice[m];
    }
  }
  cnMoney += cnInteger + cnDec;
  return cnMoney;
}

console.log(convertCurrency(1234.567)); //壹仟贰佰叁拾肆元陆角柒分

上述代码以9位数为基本单位,将整数和小数分开处理,并逐位解析,然后反向输出成中文大写金额形式。同时上代码中保证了精度问题,也可以正确处理角分等小数部分的情况。

四、js数字转大写方法

JavaScript没有提供直接将数字转换为中文大写的方法,因此需要我们自行编写。这篇文章中给出的示例代码已经实现了数字转大写汉字、数字转中文大写、数字转大写金额等几种需求。具体代码实现中可以根据实际需要进行相应修改,以实现各自的需求。

以下是示范代码:

function numberToChinese(num) {
  var digit = '零一二三四五六七八九';
  var unit = [ '十','百','千','万','亿'];
  var s = num.toString();
  var len = s.length;
  var result = '';
  for(var i = 0; i < len; i++){
    var index = len - i - 1;
    var current = digit[parseInt(s[index])];
    var next = digit[parseInt(s[index - 1])] || '';
    if(current === '零' && next === '零') continue;
    if(current === '零') current = '';
    if(index === 0 && current === '一') current = '';
    result = current + unit[i % 4] + result;
    if(index % 4 ===0) result = unit[Math.floor(i / 4) + 3] + result;
  }
  return result;
}

function toChineseNum(num){
  if(!/^\d*(\.\d*)?$/.test(num)){
    return "非数字!";
  }
  var cnNums = ["零","一","二","三","四","五","六","七","八","九"];
  var cnIntRadice = ["","十","百","千"];
  var cnIntUnits = ["","万","亿","万亿"];
  var cnDecUnits = ["角","分"];
  var cnInteger = "整";
  var cnStr = "";
  var parts;
  var zeroCount;
  if(num === ""){
    return "零";
  }
  num = parseFloat(num);
  if(num >= 1 && num <= 999999999999.99){
    var isNegative = false;
    if(num < 0){
      isNegative = true;
      num = -num;
    }
    num = num.toFixed(2);
    if(num.indexOf(".") === -1){
      parts = [num, ""];
    }else{
      parts = num.toString().split(".");
    }
    if(parseInt(parts[0],10) > 0){// 整数部分
      zeroCount = 0;
      var intLen = parts[0].length;
      for(var i=0;i 0){
            cnStr += cnNums[0];
          }
          zeroCount = 0; //归零
          cnStr += cnNums[parseInt(n)]+cnIntRadice[m];
        }
        if(m === 0 && zeroCount < 4){
          cnStr += cnIntUnits[q];
          zeroCount = 0;
        }
      }
      cnStr += cnInteger;
    }
    if(cnStr === ""){
      cnStr += cnNums[0]+cnInteger;
    }   
    if(parts[1] && parseFloat(parts[1]) > 0){//小数部分
      var decLen = parts[1].length;
      for(var j=0;j