Convert digits into words with JavaScript

后端 未结 27 1574
我寻月下人不归
我寻月下人不归 2020-11-22 15:08

I am making a code which converts the given amount into words, heres is what I have got after googling. But I think its a little lengthy code to achieve a simple task. Two R

27条回答
  •  盖世英雄少女心
    2020-11-22 15:54

    Another conversion that uses remainders and supports different languages:

    function numberToWords(number) {
      var result = [];
    
      var fraction = number.toFixed(2).split('.');
      var integer_part = parseInt(fraction[0]);
      // var fractional_part = parseInt(fraction[1]); -- not handled here
    
      var previousNumber = null;
      for (var i = 0; i < fraction[0].length; i++) {
        var reminder = Math.floor(integer_part % 10);
        integer_part /= 10;
        var name = getNumberName(reminder, i, fraction[0].length, previousNumber);
        previousNumber = reminder;
        if (name)
          result.push(name);
      }
    
      result.reverse();
      return result.join(' ');
    }
    

    The getNumberName function is language-dependent and handles numbers up to 9999 (but it is easy to extend it to handle larger numbers):

    function getNumberName(number, power, places, previousNumber) {
      var result = "";
      if (power == 1) {
        result = handleTeensAndTys(number, previousNumber);
      } else if (power == 0 && places != 1 || number == 0) {
        // skip number that was handled in teens and zero
      } else {
        result = locale.numberNames[number.toString()] + locale.powerNames[power.toString()];
      }
    
      return result;
    }
    

    handleTeensAndTys handles multiples of ten:

    function handleTeensAndTys(number, previousNumber) {
      var result = "";
      if (number == 1) { // teens
        if (previousNumber in locale.specialTeenNames) {
          result = locale.specialTeenNames[previousNumber];    
        } else if (previousNumber in locale.specialTyNames) {
          result = locale.specialTyNames[previousNumber] + locale.teenSuffix;
        } else {
          result = locale.numberNames[previousNumber] + locale.teenSuffix;    
        }
      } else if (number == 0) { // previousNumber was not handled in teens
        result = locale.numberNames[previousNumber.toString()];
      } else { // other tys
        if (number in locale.specialTyNames) {
          result = locale.specialTyNames[number];
        } else {
          result = locale.numberNames[number];
        }
        result += locale.powerNames[1];
        if (previousNumber != 0) {
          result += " " + locale.numberNames[previousNumber.toString()];
        }
      }
      return result;
    }
    

    Finally, locale examples:

    var locale = { // English
      numberNames: {1: "one", 2: "two", 3: "three", 4: "four", 5: "five", 6: "six", 7: "seven", 8: "eight", 9: "nine" },
      powerNames: {0: "", 1: "ty", 2: " hundred", 3: " thousand" },
      specialTeenNames: {0: "ten", 1: "eleven", 2: "twelve" },
      specialTyNames: {2: "twen", 3: "thir", 5: "fif" },
      teenSuffix: "teen"
    };
    
    var locale = { // Estonian
      numberNames: {1: "üks", 2: "kaks", 3: "kolm", 4: "neli", 5: "viis", 6: "kuus", 7: "seitse", 8: "kaheksa", 9: "üheksa"},
      powerNames: {0: "", 1: "kümmend", 2: "sada", 3: " tuhat" },
      specialTeenNames: {0: "kümme"},
      specialTyNames: {},
      teenSuffix: "teist"
    };
    

    Here's a JSFiddle with tests: https://jsfiddle.net/rcrxna7v/15/

提交回复
热议问题