« SIer向けの管理ツールが欲しい | メイン | Mashup Award 4th公式ブログのRSSフィード »

お金をカウント

"Code Challenge: Change Dispenser"より、0.37ドルがコインだと何枚になるかカウントするロジック。

function makeChange (money) {
    var i, num,
        output = [],
        coins  = [
            [100, "dollar",  "dollars" ],
            [25,  "quarter", "quarters"],
            [10,  "dime",    "dimes"   ],
            [5,   "nickel",  "nickels" ],
            [1,   "penny",   "pennies" ]
        ];
    money = money * 100; // avoid float precision issues
    for (i = 0; i < coins.length; i++) {
        num = Math.floor(money / coins[i][0]);
        money -= num * coins[i][0];
        if (num) {
            output.push(num + " " + coins[i][num > 1 ? 2 : 1]);
        }
    }
    return output.join(", ");
}

makeChange(0.37); // "1 quarter, 1 dime, 2 pennies"

ポイントは、コインが複数のときは単位を複数形にするところですね。

これを応用して、日本のお金で。

日本円の場合、複数になっても単語が複数形にならないから、若干楽かも。

function makeChange (money) {
    var i, num,
        output = [],
        coins  = [
            [10000, "1万円札"],
            [5000,  "5000円札"],
            [2000,  "2000円札" ],
            [1000,   "1000円札" ],
            [500,   "500円玉" ],
            [100,   "100円玉" ],
            [50,   "50円玉" ],
            [10,   "10円玉" ],
            [5,   "5円玉" ],
            [1,   "1円玉" ]
        ];
    for (i = 0; i < coins.length; i++) {
        num = Math.floor(money / coins[i][0]);
        money -= num * coins[i][0];
        if (num) {
            output.push(coins[i][1]+ " × " + num );
        }
    }
    return output.join(", ");
}
makeChange(12057); // "1万円札 × 1, 2千円札 × 1,  50円玉 × 1, 5円玉 × 1, 1円玉 × 2"  

だからどうしたってロジックですね。