Ruby: Tax Estimator

I got bored a couple of weeks ago and wanted to figure out how much I'd be paying in taxes depending on how much I made. I wrote this little script in Ruby to give me a basic estimate of how much I'd owe. You can use it at your own risk or make it better and share it with me!

Here is the source:

# --------------------------------------------------------------------
# Amounts to analyze taxes for.
# --------------------------------------------------------------------
amounts = [40000, 50000, 60000]
pto = 80 # Specify amount of hours as integer

# --------------------------------------------------------------------
# Tax schedule for 2006 supplied by IRS
# (http://www.irs.gov/formspubs/article/0,,id=150856,00.html)
#
# Arizona tax information obtained from
# (http://dab.nfc.usda.gov/pubs/docs/taxformulas/formulas/statecitycounty/taxaz/taxaz.html)
# --------------------------------------------------------------------
tax_rates = [0.1, 0.15, 0.25, 0.28, 0.33, 0.35]
cutoff_levels = [0, 7550, 30650, 74200, 154800, 336550]
pre_tax_balances = [0, 755, 4220, 15107.5, 37675.5, 97653]
az_tax_rates = [0.1,0.19]
az_cutoff = 10000
work_hours = 52*40-pto

# --------------------------------------------------------------------
# Extend the numeric clas to accomodate formatting.
# --------------------------------------------------------------------
class Numeric
  def to_currency
    sprintf("$%0.2f", self)
  end

  def to_percent
    sprintf("%d%", self*100)
  end
end

# --------------------------------------------------------------------
# Calculate the amounts.
# --------------------------------------------------------------------
for amount in amounts

  # Determine the federal witholding bracket
  index = 0
  for cutoff in cutoff_levels
    if amount > cutoff then bracket = index end
    index += 1
  end

  # Determine the state tax withholding percentage
  (amount < az_cutoff) ? az_index = 0 : az_index = 1

  # Calculate withholding amounts and remaining income
  tax = (amount-cutoff_levels[bracket])*tax_rates[bracket] + pre_tax_balances[bracket]
  az_tax = tax * az_tax_rates[az_index]
  income = amount - tax - az_tax

  # Print out the results
  puts "---------------------------------------------------------------"
  puts "Income Analyses for #{amount.to_currency} w/ #{pto} hours of paid time off "
  puts "---------------------------------------------------------------"
  puts "This level of income would put you in the level #{bracket+1} tax bracket which charges #{tax_rates[bracket].to_percent}."
  puts "In addition this income qualifies for the #{az_tax_rates[az_index]} state income tax level."
  puts "Total income: #{income.to_currency} after #{tax.to_currency} in federal tax expenses and #{az_tax.to_currency} in state tax expenses.."
  puts "------------------------------\nPost Tax Income\n------------------------------"
  puts "Monthly income: #{(income/12).to_currency}"
  puts "Bi-Weekly income: #{(income/24).to_currency}"
  puts "------------------------------\nHourly Income\n------------------------------"
  puts "You are going to work #{work_hours} hours this year."
  puts "That will make up #{(work_hours.to_f/(365*12)).to_percent} percent of your active time."
  puts "Before tax your hourly income is #{(amount / work_hours).to_currency} taking paid time off into account."
  puts "After tax your hourly income is #{(income / work_hours).to_currency} taking paid time off into account."
  puts "\n\n"

end