Because the speech engine works best with predefined phrases, you're best off defining your values like you're doing.
If you want less command list clutter though, you can use dynamic command names:
Desired altitude [3..7][5;0]00 [feet;];Desired Altitude [8..18],000 [feet;]Set integer [DesiredAltitude] value to the converted value of {TXTNUM:"{CMD}"}
Write '[Purple] Desired altitude {INT:DesiredAltitude}' to log
However, this does not currently work(in v1.6.1.7), even though it should.
A bug report has been filed.Also, "[feet]" won't make saying "feet" optional, "[feet;]" will.
EDIT: Alright, so the above example is a bust, for now. However, you can still use a single command to do it, it'll just have a longer name:
Desired altitude [3500;4000;4500;5000;5500;6000;6500;7000;7500;8000;9000;10000;11000;12000;13000;14000;15000;16000;17000;18000] [feet;]Set integer [DesiredAltitude] value to the converted value of {TXTNUM:"{CMD}"}
Write '[Purple] Desired altitude {INT:DesiredAltitude}' to log