Also, Darkgoalie, the process is simple enough that I've managed to program both the HP and stat calculation formulas into my old TI-83 Plus. Gen 1 and Gen 2 used a different formula from what I know, though. The main rule is that after any step, if you end up with a decimal, drop the decimal part before continuing. (HP uses a different equation than the other stats, so I'll cover that one second.)
For both these formulas, you'll need to know the Pokemon's base value for that stat, its level, the number of EVs invested, and the IV it has for that stat. Call them B, L, E and I for ease of use.
First, the stat calculation:
1. Divide E by 4.
2. Add to this value I, then add B, then add B again.
3. Divide L by 100 (just move the decimal point over 2 places to the left), then multiply this by your running total.
4. Add 5.
5. If your Pokemon has a Nature that affects the chosen stat, multiply your running total by 1.1 for a boosting nature and 0.9 for a hindering nature.
For HP, since there is no nature boost/hindrance, the process is a little different. Steps 1, 2 and 3 are as before, but the last two steps are as follows:
4. Add the Pokemon's level.
5. Add 10.
In the case of Choice items being held or ability-granted stat boosts, apply the appropriate modifier to the appropriate stat. Thus, a level 100 Azumarill running an attack-boosting nature such as Adamant, maximum investment in the Attack stat, a 31 IV in Attack and the ability Huge Power (doubles attack) when holding a Choice Band (1.5x to attack stat, first move used is only one that can be used until called back) packs a spine-tingling 654 Attack behind that STAB Aqua Jet. There are ways to get the attack stat even higher (Guts Heracross holding Toxic Orb using Swords Dance on his initial turn reaches a staggering 1049 attack!), but they're progressively riskier.