There we go. Golfing the version before broke it, but now we're back online. I'm positive it can be further golfed. I'll work on it more tomorrow. It was hard enough to get it working properly WITHOUT golfing it, though, and my eyes are tired of staring at it. Haha
Java - 3220
import java.util.*;class a{int D=0,i,l,j;static boolean T=true,F=false;enum O{A("plus"),S("minus"),M("times"),D(""),P("point");String t;O(String u){t=u;}double p(double f,double s){if(this==A)f+=s;if(this==S)f-=s;if(this==M)f*=s;if(this==D)f/=s;return f;}static O f(String s){O r=null;for(O o:values())if(s.equals(o.t))r=o;return r;}}enum N{A("zero",0,F),B("one",1,F),C("two",2,F),D("three",3,F),E("four",4,F),AG("five",5,F),G("six",6,F),H("seven",7,F),I("eight",8,F),J("nine",9,F),K("ten",10,F),L("eleven",11,F),M("twelve",12,F),N("thirteen",13,F),O("fourteen",14,F),P("fifteen",15,F),Q("sixteen",16,F),R("seventeen",17,F),S("eighteen",18,F),AH("nineteen",19,F),U("twenty",20,F),V("thirty",30,F),W("forty",40,F),X("fifty",50,F),Y("sixty",60,F),Z("seventy",70,F),AA("eighty",80,F),AB("ninety",90,F),AC("hundred",100,T),AD("thousand",1000,T),AE("million",1000000,T),AF("billion",1000000000,T);String t;double v;boolean q;N(String u,int w,boolean r){t=u;v=w;q=r;}static N f(String s){N r=null;for(N n:values())if(s.equals(n.t))r=n;return r;}static N f(char s){return d(q(""+s));}static N d(double v){N r=null;for(N n:values())if(v==n.v)r=n;return r;}static String c(double n){return d(n).t;}}public static void main(String[]a){new a();}a(){while(T){try{List p=p(new Scanner(System.in).nextLine()),t=new ArrayList();double d=0;for(j=0;j<p.size();j++){Object o=p.get(j);if(o(o)){if((O)o==O.P){t.add((d(t.get(t.size()-1))+((d=d(p.get(j+1)))<10?d*=100:d<100?d*=10:d)/1000));t.remove(t.size()-2);j++;}else t.add(o);}else {N n=N.d(d(o));if(n!=null&&n.q){t.add((d(o))*d(t.get(t.size()-1)));t.remove(t.size()-2);}else t.add(o);}}double r=d(t.get(0));for(j=1;j<t.size();j++){Object c=t.get(j),l=t.get(j-1);if(o(c))continue;if(c instanceof Double&&l instanceof Double)r+=d(c);else r=((O)t.get(j-1)).p(r,d(t.get(j)));}System.out.println(p(r));}catch(Exception e){System.out.println("E");}}}List p(String s) {List r=new ArrayList();Scanner i=new Scanner(s);while(i.hasNext()){String c=i.next();if(c.equals("divided")){r.add(O.D);i.next();}else if(c.indexOf("-")!=-1){String[] num=c.split("-");r.add(N.f(num[0]).v+N.f(num[1]).v);}else{Object o=N.f(c);r.add(o!=null?((N)o).v:O.f(c));}}return r;}String p(double n){String a=String.valueOf(n),w,d=null,b="";l=a.indexOf(".");if(l!=-1){w=a.substring(0,l);d=a.substring(l+1);}else w=a;if(d.equals("0"))d=null;D=0;while(w.length()%3!=0)w=" "+w;for(i=w.length();i>0;i-=3,D++)b=w(w.substring(i-3,i))+b;return b+d(d);}String w(String w) {if(w==null)return "";w=w.trim();String b="";l=w.length();if(l>1&&w.charAt(l-2)!='0'){if(w.charAt(l-2)=='1')b=N.d(q(w.substring(l-2))).t;else b+=N.d(q(w.charAt(l-2)+"0")).t+"-"+N.f(w.charAt(l-1)).t;}for(j=(b.equals("")?l-1:l-3);j>-1;j--){N n=N.f(w.charAt(j));if(n==N.A)continue;if(j==l-1)b=n.t;else if(j==l-2)b=N.f(n.t+"0")+"-"+b;else if(j==l-3)b=n.t+" hundred "+b;}if(!b.trim().equals("")){if(D==1)b+=" thousand ";if(D==2)b+=" million ";if(D==3)b+=" billion ";}return b;}String d(String d) {if(d==null)return"";if(d.length()>3)d=d.substring(0,3);String b = " point ";for(char n:d.toCharArray())b+=N.f(n).t+" ";return b;}boolean o(Object o){return o instanceof O;}Double d(Object o){return (Double)o;}static double q(String s){return Double.parseDouble(s);}}
With line breaks and tabs
import java.util.*;
class a{
int D=0,i,l,j;
static boolean T=true,F=false;
enum O{
A("plus"),
S("minus"),
M("times"),
D(""),
P("point");
String t;
O(String u){
t=u;
}
double p(double f,double s){
if(this==A)f+=s;
if(this==S)f-=s;
if(this==M)f*=s;
if(this==D)f/=s;
return f;
}
static O f(String s){
O r=null;
for(O o:values())if(s.equals(o.t))r=o;
return r;
}
}
enum N{
A("zero",0,F),
B("one",1,F),
C("two",2,F),
D("three",3,F),
E("four",4,F),
AG("five",5,F),
G("six",6,F),
H("seven",7,F),
I("eight",8,F),
J("nine",9,F),
K("ten",10,F),
L("eleven",11,F),
M("twelve",12,F),
N("thirteen",13,F),
O("fourteen",14,F),
P("fifteen",15,F),
Q("sixteen",16,F),
R("seventeen",17,F),
S("eighteen",18,F),
AH("nineteen",19,F),
U("twenty",20,F),
V("thirty",30,F),
W("forty",40,F),
X("fifty",50,F),
Y("sixty",60,F),
Z("seventy",70,F),
AA("eighty",80,F),
AB("ninety",90,F),
AC("hundred",100,T),
AD("thousand",1000,T),
AE("million",1000000,T),
AF("billion",1000000000,T);
String t;
double v;
boolean q;
N(String u,int w,boolean r){
t=u;
v=w;
q=r;
}
static N f(String s){
N r=null;
for(N n:values())if(s.equals(n.t))r=n;
return r;
}
static N f(char s){
return d(q(""+s));
}
static N d(double v){
N r=null;
for(N n:values())if(v==n.v)r=n;
return r;
}
static String c(double n){
return d(n).t;
}
}
public static void main(String[]a){
new a();
}
a(){
while(T){
try{
List p=p(new Scanner(System.in).nextLine()),t=new ArrayList();
double d=0;
for(j=0;j<p.size();j++){
Object o=p.get(j);
if(o(o)){
if((O)o==O.P){
t.add((d(t.get(t.size()-1))+((d=d(p.get(j+1)))<10?d*=100:d<100?d*=10:d)/1000));
t.remove(t.size()-2);
j++;
}
else t.add(o);
}
else {
N n=N.d(d(o));
if(n!=null&&n.q){
t.add((d(o))*d(t.get(t.size()-1)));
t.remove(t.size()-2);
}
else t.add(o);
}
}
double r=d(t.get(0));
for(j=1;j<t.size();j++){
Object c=t.get(j),l=t.get(j-1);
if(o(c))continue;
if(c instanceof Double&&l instanceof Double)r+=d(c);
else r=((O)t.get(j-1)).p(r,d(t.get(j)));
}
System.out.println(p(r));
}
catch(Exception e){
System.out.println("E");
}
}
}
List p(String s) {
List r=new ArrayList();
Scanner i=new Scanner(s);
while(i.hasNext()){
String c=i.next();
if(c.equals("divided")){
r.add(O.D);
i.next();
}
else if(c.indexOf("-")!=-1){
String[] num=c.split("-");
r.add(N.f(num[0]).v+N.f(num[1]).v);
}
else{
Object o=N.f(c);
r.add(o!=null?((N)o).v:O.f(c));
}
}
return r;
}
String p(double n){
String a=String.valueOf(n),w,d=null,b="";
l=a.indexOf(".");
if(l!=-1){
w=a.substring(0,l);
d=a.substring(l+1);
}
else w=a;
if(d.equals("0"))d=null;
D=0;
while(w.length()%3!=0)w=" "+w;
for(i=w.length();i>0;i-=3,D++)b=w(w.substring(i-3,i))+b;
return b+d(d);
}
String w(String w) {
if(w==null)return "";
w=w.trim();
String b="";
l=w.length();
if(l>1&&w.charAt(l-2)!='0'){
if(w.charAt(l-2)=='1')b=N.d(q(w.substring(l-2))).t;
else b+=N.d(q(w.charAt(l-2)+"0")).t+"-"+N.f(w.charAt(l-1)).t;
}
for(j=(b.equals("")?l-1:l-3);j>-1;j--){
N n=N.f(w.charAt(j));
if(n==N.A)continue;
if(j==l-1)b=n.t;
else if(j==l-2)b=N.f(n.t+"0")+"-"+b;
else if(j==l-3)b=n.t+" hundred "+b;
}
if(!b.trim().equals("")){
if(D==1)b+=" thousand ";
if(D==2)b+=" million ";
if(D==3)b+=" billion ";
}
return b;
}
String d(String d) {
if(d==null)return"";
if(d.length()>3)d=d.substring(0,3);
String b = " point ";
for(char n:d.toCharArray())b+=N.f(n).t+" ";
return b;
}
boolean o(Object o){
return o instanceof O;
}
Double d(Object o){
return (Double)o;
}
static double q(String s){
return Double.parseDouble(s);
}
}
two plus two minus five times five divided by negative zero point five
->2 + 2 - 5 * 5 / -0.5
->54
. \$\endgroup\$one million one
on the input orone billion one
on the output? Also, does the 1e6 limit or the 1e9 limit apply to intermediate results as well? \$\endgroup\$one hundred divided by three point nought
? (Also, why is the output of the final exampleE
rather thanthree million
?) \$\endgroup\$