Originally Posted by
Bodsda
Extra credit
Allow the use of words for the values, e.g. "Twenty six" should be recognized as 26 and no error should be raised.
I'll just go for the extra credit part in java.
Edit: Caters for "twentysix" and "twenty six" but not "twenty-six";
PHP Code:
import java.util.HashMap;
public class StrToNum {
private HashMap<String, Integer> postnumbers;
private HashMap<String, Integer> numbers;
private HashMap<String, Integer> teenpre;
private HashMap<String, Integer> pre;
private String ten = "teen";
private String decade = "ty";
{
postnumbers = new HashMap<String, Integer>();
postnumbers.put("one", 1);
postnumbers.put("two", 2);
postnumbers.put("three", 3);
postnumbers.put("four", 4);
postnumbers.put("five", 5);
postnumbers.put("six", 6);
postnumbers.put("seven", 7);
postnumbers.put("eight", 8);
postnumbers.put("nine", 9);
numbers = new HashMap<String, Integer>();
numbers.putAll(postnumbers);
numbers.put("ten", 10);
numbers.put("eleven", 11);
numbers.put("twelve", 12);
numbers.put("hundred", 100);
teenpre = new HashMap<String, Integer>();
teenpre.put("thir", 3);
teenpre.put("four", 4);
teenpre.put("fif", 5);
teenpre.put("six", 6);
teenpre.put("seven", 7);
teenpre.put("eigh", 8);
teenpre.put("nine", 9);
pre = new HashMap<String, Integer>();
pre.put("twen", 2);
pre.putAll(teenpre);
}
public int convert(String str) throws NumberFormatException {
str = str.toLowerCase();
int indexD = str.indexOf(decade);
int indexT = str.indexOf(ten);
String sub, post;
try {
if ( indexT != -1) { //String contains "teen"
sub = str.substring(0, indexT);
if (ten.equals(str.substring(indexT))) {
return teenpre.get(sub) + 10;
}
} else if ( indexD != -1) { //String contains ty
sub = str.substring(0, indexD);
if (decade.equals(str.substring(indexD))) { //Dividable by 10
return pre.get(sub) * 10;
} else {
post = str.substring(indexD + decade.length()).trim();
return (pre.get(sub) * 10) + postnumbers.get(post);
}
} else {
return numbers.get(str);
}
throw new Exception();
} catch (Exception e) {
throw new NumberFormatException(str + " is not a valid number");
}
}
}
Bookmarks