はてブロ@ama_ch

https://twitter.com/ama_ch

超セレブな携帯向け割り勘電卓をPythonで書いてみた

携帯電話向け「割り勘電卓」を公開します - 頭ん中
さんを見て、PythonでCGIを書く勉強に書いてみました。


本体:
http://ama-ch.com/cgi-bin/warikan.cgi


均等割り電卓と同じ「ような」動作をします。携帯向けとか言いながら携帯向けにWebを作ったことなどないので、ただ携帯からも使えますっていうだけです。あ、テキストエリアにistyle="4"という値を与えると携帯の入力モードが最初から数字になることは弄ってて知りました。勉強になりました。


使いどころ:
せっかく作ったので使いどころを解説します。
一見パクリ低機能な電卓ですが、Pythonで書いているので通常のint型での最大値2^31=2147483647より大きい値でも正確に計算することができます。メモリが許す限り計算できます。
なので、お会計が21億4748万3648円以上の時に、ぜひ使ってください。まさにセレブ向けですね!
ちなみに僕の携帯の電卓では9999億9999万9999まで計算できました。


ソース:
相変わらず汚い><
http://gist.github.com/9649

#!/usr/bin/python
# -*- coding: utf-8 -*-
""" warikan.cgi
飲み会で使える割り勘電卓
"""
import cgi 
import cgitb; cgitb.enable()

print "Content-type: text/html"
html = """
<html><title>割り勘電卓</title><body>
<form action="warikan.cgi">
<p>
総額:
<input name="amount" type="text" istyle="4" size="6" value="%s" />円<br />
人数:
<input name="persons" type="text" istyle="4" size="2" value="%s" />人<br />
</p>
<input type="submit" value="計算する" /></form>
<p>%s</p>
</body></html>
"""

form = cgi.FieldStorage()  #CGIに渡されたデータを取得
try:
    amount = int(form.getfirst("amount", "0"))
    persons = int(form.getfirst("persons", "1"))
except:
    amount = 0
    persons = 1

def calc(amount, persons):
    if not (amount % persons):
        warikiri = "一人あたり%d円です。<br />" % (amount / persons) # ぴったり額
    else:
        warikiri = ""
    payment1 = (amount / persons) / 100 * 100          # 多め額
    payment2 = (amount / persons) / 100 * 100 + 100    # 少なめ額
    while payment1 * persons < amount:
        payment1 += 100
    while payment2 * persons > amount:
        payment2 -= 100
    return "%s一人あたり%d円だと、%d円余ります。<br />一人あたり%d円だと、%d円足りません。" % (warikiri, payment1, payment1*persons-amount, payment2, amount-payment2*persons)

if persons and (amount / persons):
    result = calc(amount, persons)
else:
    result = ""

print html % (amount, persons, result)