Я создаю калькулятор для ног и дюймов. Я хочу, чтобы пользователь мог вводить информацию различными способами, такими как 1'-4-5/8 " или 1 4 5/8.
При выполнении математики вышеуказанные числа должны быть преобразованы в десятичные (1'-4-5/8 "- 16,625 в десятичных дюймах). Конечный результат будет в десятичных дюймах или затем преобразован обратно в футы и дюймы.
Как я могу разобрать архитектурные измерения и преобразовать их в десятичные дюймы?
Любая помощь будет принята с благодарностью!
Спасибо!
edit: После слишком много времени и попыток многого другого, я думаю, что у меня есть что-то, что сработает. В конечном итоге я ограничу то, как пользователь может ввести длину, поэтому я думаю, что следующее будет работать. Он не может быть оптимизирован, но это лучшее, что я могу получить прямо сейчас.
public class delim_test_cases {
public static void main(String[] args) {
double inches = 0;
double feet = 0;
double fract = 0;
String str = "2'-3-7/8";
String[] TempStr;
String delimiter = ("[-]+");
TempStr = str.split(delimiter);
for(int i=0; i< TempStr.length ; i++ ) {
for(int z=0; z< TempStr[i].length() ; z++ ) {
if (TempStr[i].charAt(z) == '\'') {
String[] FeetStr;
String feetdelim = ("[\']+");
FeetStr = TempStr[i].split(feetdelim);
feet = Integer.parseInt(FeetStr[0]);
}
else if (TempStr[i].charAt(z) == '/') {
String[] FracStr;
String fracdelim = ("[/]+");
FracStr = TempStr[i].split(fracdelim);
double numer = Integer.parseInt(FracStr[0]);
double denom = Integer.parseInt(FracStr[1]);
fract = numer/denom;
}
else if (TempStr[i].indexOf("\'")==-1 && TempStr[i].indexOf("/")==-1) {
String inchStr;
inchStr = TempStr[i];
inches = Integer.parseInt(inchStr);
}
}
}
double answer = ((feet*12)+inches+fract);
System.out.println(feet);
System.out.println(inches);
System.out.println(fract);
System.out.println(answer);
}
}
Почему бы просто не разделить ни на "-", ни на пробел, тогда у вас есть массив из 3 строк.
Итак, вы смотрите на последнего персонажа, если это одиночная цитата, затем умножьте это на 12.
Если двойная кавычка, затем разделите на "/" и просто вычислите дробь, а для числа, которое не является ни одним из них, оно равно дюйму, просто добавьте его к сумме.
Таким образом, вы не принимаете приказ или что делать, если у вас только дробные дюймы.
Просто пройдите через массив, а затем перейдите по вышеприведенному алгоритму, поэтому, если кто-то сделал
3'-4'-4/2"
то вы можете легко вычислить его.
ОБНОВИТЬ:
Я добавляю код, основанный на комментарии от OP.
Вы можете обратиться к этому, чтобы получить больше идей о split
.
http://www.java-examples.com/java-string-split-example
Но, в основном, просто сделайте что-то вроде этого (не проверено, просто выписано):
public double convertArchToDecimal(String instr, String delimiter) {
String[] s = instr.split(delimiter);
int ret = 0;
for(int t = 0; t < s.length; t++) {
char c = s[t].charAt(s[t] - length);
switch(c) {
case '\'': //escape single quote
String b = s[t].substring(0, s[t].length - 1).split("/");
try {
ret += Integer.parse(s[t].trim()) * 12;
} catch(Exception e) { // Should just need to catch if the parse throws an error
}
break;
case '"': // may need to escape the double quote
String b = s[t].substring(0, s[t].length - 1).split("/");
int f = 0;
int g = 0;
try {
f = Integer.parse(b[0]);
g = Integer.parse(b[1]);
ret += f/g;
} catch(Exception e) {
}
break;
default:
try {
ret += Integer.parse(s[t].trim());
} catch(Exception e) { // Should just need to catch if the parse throws an error
}
break;
}
}
return ret;
}
Я предпочитаю больше исключений, чем нужно, и вы можете использовать метод trim()
больше, чем я, чтобы разделить пробелы перед разбором, чтобы защитить от 3/5 "
например.
Проходя в пространстве или тире, это должно быть достаточно для ваших нужд.
Вы также можете округлить до некоторых значимых цифр, в противном случае округление может вызвать проблемы для вас позже.