Haskell, 252 231 bytes
let l=words;k=l"six seven eight nine";w=l"one two three four five"++k++l"ten eleven twelve"++((++"teen")<$>l"thir four fif"++k)++[n++"ty"++s|n<-l"twen thir for fif"++k,s<-"":['-':x|x<-take 9w]]in maybe 100id.flip lookup(zip w[1..])
This creates a list of all English number names from "one" to "ninety-nine" and then looks the index of the input up. If it doesn't exist, we're in the edge case "one hundred", so it returns 100
, otherwise it's going to return the index.
Ungolfed
-- k in the golfed variant
common = words "six seven eight nine"
-- w in the golfed variant
numbers = words "one two three four five" ++ common
++ words "ten eleven twelve" ++ [p ++ "teen" | p <- words "thir four fif" ++ common]
++ [p ++ "ty" ++ s| p <- words "twen thir for fif" ++ common
, s <- "" : map ('-':) (take 9 numbers)]
-- part of the expression in the golfed variant
convert :: String -> Int
convert s = maybe 100 id $ lookup s $ zip numbers [1..]