Translate number to Chinese

一二三 => 零壹貳

by nuysoft

HTML

<input id="number" value="0">
<div id="cn"></div>

CSS

html,
body {
    height: 100%;
}

body {
    margin: 10px;
    pading: 0;
}

input#number {
    height: 30%;
    width: 100%;
    font-size: 2rem;
    text-align: center;
}

div#cn {
    margin-top: 20px;
    height: 60%;
    font-size: 3rem;
    text-align: center;
}

JavaScript

var NUMBER_LOWER = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'] // 〇
var NUMBER_UPPER = ['零', '壹', '貳', '參', '肆', '伍', '陸', '柒', '捌', '玖']
var UNIT_LOWER = ['', '十', '百', '千']
var UNIT_UPPER = ['', '拾', '佰', '仟']
var UNIT_GROUP_LOWER = ['', '万', '亿', '兆']
var UNIT_GROUP_UPPER = ['', '萬', '億', '兆']

function translate(number, upper) {
    var NUMBER = upper ? NUMBER_UPPER : NUMBER_LOWER
    var UNIT = upper ? UNIT_UPPER : UNIT_LOWER
    var GROUP = upper ? UNIT_GROUP_UPPER : UNIT_GROUP_LOWER
    var result = []

    // 1234567890 => [ 0 9 8 7 6 5 4 3 2 1 ]
    var str = Math.abs(number).toString().split('').reverse()
    for (var i = 0, part; i < str.length; i++) {
        part = parseInt(i / 4) // 0 9 8 7, 6 5 4 3, 2 1
        result[part] = result[part] || []
        result[part].push(
            NUMBER[str[i]] + // 0 => 零
            (str[i] !== '0' ? UNIT[i % 4] : '') // + 十 百 千
        )
    }
    for (var ii = 0; ii < result.length; ii++) {
        result[ii] = result[ii].reverse().join('') +
            GROUP[ii] // + 万 亿 兆
    }
    console.log(result)
    return (number < 0 ? '负' : '') +
        result.reverse().join('')
        .replace(/([〇零])[〇零]+/g, '$1')
        .replace(/^[一壹](十|拾)/g, '$1')
        .replace(/([十拾])[〇零]+/g, '$1')
        .replace(/[〇零]+$/g, '')
        .replace(/[〇零]([万亿兆萬億兆])/g, '$1')
        .replace(/([兆兆])[亿億]/g, '$1')
        .replace(/([亿億])[万萬]/g, '$1')
        .replace(/([兆兆])[万萬]/g, '$1')
}

$('#number').on('keydown', function(event) {
    switch (event.which) {
        case 38:
            $(event.target).val(+$(event.target).val() + 1)
            break
        case 40:
            $(event.target).val(+$(event.target).val() - 1)
            break
    }
    $(event.target).trigger('input')
})

$('#number').on('input', function(event) {
    $('#cn').html(
        '<div>' + translate($(event.target).val()) + '</div>' +
        '<div>' + translate($(event.target).val(), true) + '</div>'
    )
})

$('#number').val(
   ...