Convert digits into words with JavaScript

后端 未结 27 1486
我寻月下人不归
我寻月下人不归 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:58

        function numberToEnglish( n ) {
            
            var string = n.toString(), units, tens, scales, start, end, chunks, chunksLen, chunk, ints, i, word, words, and = 'and';
    
            /* Remove spaces and commas */
            string = string.replace(/[, ]/g,"");
    
            /* Is number zero? */
            if( parseInt( string ) === 0 ) {
                return 'zero';
            }
            
            /* Array of units as words */
            units = [ '', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen' ];
            
            /* Array of tens as words */
            tens = [ '', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety' ];
            
            /* Array of scales as words */
            scales = [ '', 'thousand', 'million', 'billion', 'trillion', 'quadrillion', 'quintillion', 'sextillion', 'septillion', 'octillion', 'nonillion', 'decillion', 'undecillion', 'duodecillion', 'tredecillion', 'quatttuor-decillion', 'quindecillion', 'sexdecillion', 'septen-decillion', 'octodecillion', 'novemdecillion', 'vigintillion', 'centillion' ];
            
            /* Split user argument into 3 digit chunks from right to left */
            start = string.length;
            chunks = [];
            while( start > 0 ) {
                end = start;
                chunks.push( string.slice( ( start = Math.max( 0, start - 3 ) ), end ) );
            }
            
            /* Check if function has enough scale words to be able to stringify the user argument */
            chunksLen = chunks.length;
            if( chunksLen > scales.length ) {
                return '';
            }
            
            /* Stringify each integer in each chunk */
            words = [];
            for( i = 0; i < chunksLen; i++ ) {
                
                chunk = parseInt( chunks[i] );
                
                if( chunk ) {
                    
                    /* Split chunk into array of individual integers */
                    ints = chunks[i].split( '' ).reverse().map( parseFloat );
                
                    /* If tens integer is 1, i.e. 10, then add 10 to units integer */
                    if( ints[1] === 1 ) {
                        ints[0] += 10;
                    }
                    
                    /* Add scale word if chunk is not zero and array item exists */
                    if( ( word = scales[i] ) ) {
                        words.push( word );
                    }
                    
                    /* Add unit word if array item exists */
                    if( ( word = units[ ints[0] ] ) ) {
                        words.push( word );
                    }
                    
                    /* Add tens word if array item exists */
                    if( ( word = tens[ ints[1] ] ) ) {
                        words.push( word );
                    }
                    
                    /* Add 'and' string after units or tens integer if: */
                    if( ints[0] || ints[1] ) {
                        
                        /* Chunk has a hundreds integer or chunk is the first of multiple chunks */
                        if( ints[2] || ! i && chunksLen ) {
                            words.push( and );
                        }
                    
                    }
                    
                    /* Add hundreds word if array item exists */
                    if( ( word = units[ ints[2] ] ) ) {
                        words.push( word + ' hundred' );
                    }
                    
                }
                
            }
            
            return words.reverse().join( ' ' );
            
        }
    
    
    // - - - - - Tests - - - - - -
    function test(v) {
      var sep = ('string'==typeof v)?'"':'';
      console.log("numberToEnglish("+sep + v.toString() + sep+") = "+numberToEnglish(v));
    }
    test(2);
    test(721);
    test(13463);
    test(1000001);
    test("21,683,200,000,621,384");

提交回复
热议问题