JavaScript numbers to Words

前端 未结 24 1664
死守一世寂寞
死守一世寂寞 2020-11-22 14:39

I\'m trying to convert numbers into english words, for example 1234 would become: \"one thousand two hundred thirty four\".

My Tact

24条回答
  •  再見小時候
    2020-11-22 14:53

    This is a simple ES6+ number to words function. You can simply add 'illions' array to extend digits. American English version. (no 'and' before the end)

    // generic number to words
    
    let digits  = ['','one','two','three','four', 'five','six','seven','eight','nine','ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen'];
    let ties    = ['', '', 'twenty','thirty','forty','fifty', 'sixty','seventy','eighty','ninety'];
    let illions = ['', 'thousand', 'million', 'billion', 'trillion'].reverse()
    
    let join = (a, s) => a.filter(v => v).join(s || ' ')
    
    let tens = s => 
        digits[s] || 
        join([ties[s[0]], digits[s[1]]], '-') // 21 -> twenty-one
    
    let hundreds = s => 
        join(
            (s[0] !== '0' ? [digits[s[0]], 'hundred'] : [])
                .concat( tens(s.substr(1,2)) )  )
    
    let re = '^' + '(\\d{3})'.repeat(illions.length) + '$'
    
    let numberToWords = n => 
        // to filter non number or '', null, undefined, false, NaN
        isNaN(Number(n)) || !n && n !== 0 
            ? 'not a number'
            : Number(n) === 0 
                ? 'zero'  
                : Number(n) >= 10 ** (illions.length * 3)
                    ? 'too big'
                    : String(n)
                        .padStart(illions.length * 3, '0')
                        .match(new RegExp(re))
                        .slice(1, illions.length + 1)
                        .reduce( (a, v, i) => v === '000' ? a : join([a, hundreds(v), illions[i]]), '')
    
    
    // just for this question.
    
    let update = () => {
        let value = document.getElementById('number').value
        document.getElementById('container').innerHTML = numberToWords(value)
    }
    

提交回复
热议问题