Strtol

Score: 148.23 (fail)

code generator!! with correct char counts. change the eval to print to output the code. printf "#!perl -pla eval lc pack u,'%s' ", unpack u, uc <<'`' mm;$:*=/[ih]o/?!($;+=$:*1e3**y/bid//):/d/?100:($:+=/f/+/.[nwv mf]./+/w/+/[tf][hio]/*3+10*(/te/+/el/)+/[en]i/*8+6*/s/.$?x(-$ d+/y/),1)for(split);$_=$:+$;;s/.(?=(...)+$)/$&,/g `

and this one! (not that it's much shorter than your acceptable solution)

#!perl -pla
eval lc pack u,')o=H2h}h-<ӏ,,O)2@S>[$i<X<D,O$I)Ж,F}8K'

Score: 149.34 (pass)

how much effort for one precious stroke?

#!perl -pla
s~.*d|ll~$:*=/o/?!($;+=$:*1e3**y/bid//):100~e,$:+=/.[nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+10*/te|el/.$?x/y/for@F;$_=$;+$:;s/.(?=(...)+$)/$&,/g

Score: 150.26 (fail)

code generator!! printf "#!perl -pla eval lc pack u,'%s' ", unpack u, uc <<'`' mm;$:*=/[ih]o/?!($;+=$:*1e3**y/bid//):/d/?100:($:+=/f/+/.[nwv mf]./+/w/+/[tf][hio]/*3+10*(/te/+/el/)+/[en]i/*8+6*/s/.$?x(-$ f+/y/),1)for(split);$_=$:+$;;;s/.(?=(...)+$)/$&,/g+ `

sorry, Greg. Last of general rules rules this out.

#!perl -pla
eval lc pack u,')o=H2h}h-<ӏ,,O)2@S>[$i<X<D,O$I)Ж,Fo3!H8,BOc'

Score: 150.33 (pass)

#!perl -pla
$:*=/[ih]o/?!($;+=$:*1e3**y/bid//):/d/?100:($:+=/.[nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+10*/te|el/.$?x/y/,1)for@F;$_=$:+$;;s/.(?=(...)+$)/$&,/g

Score: 151.34 (pass)

#!perl -pla
$:*=/[ih]o/?($;+=$:*1e3**y/bid//,0):/d/?100:($:+=/.[nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+10*/te|el/.$?x/y/,1)for@F;$_=$:+$;;s/.(?=(...)+$)/$&,/g

Score: 153.33 (pass)

commafication has never been so easy...

#!perl -pla
$:*=/[ih]o/?($;+=$:*1e3**y/bid//,0):/d/?100:($:+=(/.[nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10).$?x/y/,1)for@F;$_=$:+$;;s/.(?=(...)+$)/$&,/g

Score: 154.34 (pass)

commafication has never been so easy...

#!perl -pla
$:*=s~[ih]o~$;+=$:*1e3**y/bid//~e?0:100*/d/||($:+=(/.[nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10).$?x/y/,1)for@F;$_=$:+$;;s/.(?=(...)+$)/$&,/g

Score: 155.34 (pass)

commafication has never been so easy...

#!perl -pla
s~[ih]o~$;+=$:*1e3**y/bid//~e?$:=0:($:+=(/[^u][nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10).$?x/y/)*=100**/d/for@F;$_=$:+$;;s/.(?=(...)+$)/$&,/g

Score: 158.35 (pass)

#!perl -pla
s~[ih]o~$;+=$:*1e3**y/bid//~e?$:=0:($:+=(/[^u][nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10).$?x/y/)*=100**/d/for@F;$_=$:+$;;s/\d(?=(\d{3})+$)/$&,/g

Score: 161.36 (pass)

#!perl -pla
s~b|ll|ho~$;+=$:*1e3**y/bid//~e?$:=0:($:+=(/[^u][nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10).$?x/y/).=$?x y/d//for@F;$_=$:+$;;s/\d(?=(\d{3})+$)/$&,/g

Score: 163.37 (pass)

#!perl -pla
(s~b|ll|ho~$;+=$:*1e3**y/bid//;$:=0~e
or$:+=(/[^u][nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10).$?x/y/+99*/hu/*$:)for@F;$_=$:+$;;s/\d(?=(\d{3})+$)/$&,/g

Score: 165.38 (pass)

#!perl -pla
for(@F){s~b|ll|ho~$;+=$:*1e3**y/bid//;$:=0~e
or$:+=(/[^u][nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10)*10**/y/+99*/hu/*$:}$_=$:+$;;s/\d(?=(\d{3})+$)/$&,/g

Score: 169.38 (pass)

and I thought commafication had been done to death in the newsgroups? the faq's version is pretty lousy

#!perl -pla
for(@F){s~b|ll|([hi]o)|hu~$:*=10**y/aehio//;$;+=$:,$:=0if$1~eg
or$:+=(/.[nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10)*10**/y/}$_=$:+$;;s/\d(?=(\d{3})+$)/$&,/g

Score: 172.38 (pass)

DOH! -p of course

#!perl -pla
for(@F){s~b|ll|([hi]o)|hu~$:*=10**y/aehio//;$;+=$:,$:=0if$1~eg
or$:+=(/.[nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10)*10**/y/}$_=$:+$;;s/(?<=\d)(?=(\d{3})+$)/,/g

Score: 179.42 (pass)

#!perl -nla
for(@F){s~(b|ll|([hi]o))|hu~$:*=$1?1e3:100;$;+=$:,$:=0if$2~eg
or$:+=(/.[nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10)*10**/y/}$_=$:+$;;1while
s/(?<=\d)\d{3}\b/,$&/;print

Score: 180.39 (pass)

#!perl -nla
for(@F){$;+=$:*1e3**@:if@:=/bi|ll|[hi]o/g;$:+=@:?$:=0:(/[^u][nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10)*10**/y/+99*/hu/*$:}$_=$:+$;;1while s/^(\d+)(?=\d{3})/$1,/;print

Score: 180.42 (pass)

#!perl -nla
for(@F){s~(b|ll|([hi]o))|hu~$:*=$1?1e3:100;$;+=$:,$:=0if$2~eg
or$:+=(/.[nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10)*10**/y/}$_=$:+$;;1while
s/^(\d+)(?=\d{3})/$1,/;print

Score: 183.38 (pass)

#!perl -nla
for(@F){$;+=$:*1e3**$-if$-=/ll|ho/+/ll/+/bi/;$:+=$-?$:=0:(/[^u][nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10)*10**/y/+99*/hu/*$:}$_=$:+$;;1while s/^(\d+)(?=\d{3})/$1,/;print

Score: 186.38 (pass)

#!perl -nla
for(@F){$;+=$:*10**$-if$-=3*(/ll|ho/+/ll/+/bi/);$:+=$-?$:=0:(/[^u][nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10)*10**/y/+99*/hu/*$:}$_=$:+$;;1while s/^(\d+)(?=\d{3})/$1,/;print

Score: 188.38 (pass)

#!perl -nla
for(@F){$;+=$:*10**$-if$-=3*(/ll|ho/+/ll/+/bi/);($:+=$-?$:=0:(/[^u][nwvf]./+/w|f/+/th|f/*3+/s/*6+/[en]i/*8+/te|el/*10)*10**/y/)*=100**/hu/}$_=$:+$;;1while s/^(\d+)(?=\d{3})/$1,/;print