У меня есть QTableWidget, где пользователь вводит сложные числа в разных стилях. Например, комплексное число (-15 + 8.14i) можно записать как:Как получить данные с пользовательского ввода?
-15 + 8.14i
-15 + 8.14j
-15 + J 8,14
-15+ i8,14
я также может быть J! Оба значения могут быть большими (они сохраняются как двойные), а также отрицательные. Они могут быть написаны с помощью «,» и «.». (поэтому 3,14 и 3,14 равны). Должно быть сообщение об ошибке, когда пользователь вводит номер неправильно.
CKomplex fromString(QString str) { // ckomplex is my custom class for complex numbers
double numReal, numImag;
QString strNew = "";
// delete all spaces
for (int i= 0; i< str.length(); i++) {
if (!str[i].isSpace()) {
strNew += str[i];
}
}
QString part1 = "";
int index;
// get the first number
for (int i= 0; i < strNew.length(); i++) { // iterate string
if (strNew[i] != '+' && strNew[i] != '-') {
part1 += strNew[i];
} else { // e.g.: 5 + 3j -> the loop is at the "+"
if (i != 0) {
index = i; // save index at "+" to start for next number
break;
}
}
}
numReal = part1.toDouble();
QString part2 = "";
// get the second number
for (int i= index; i < strNew.length(); i++) {
if (strNew[i].isDigit() || strNew[i] == '+' || strNew[i] == '-' || strNew[i] == '.' || strNew[i] == ',') { // ignore j or i
part2 += strNew[i];
}
}
numImag = part2.toDouble();
return CKomplex(numReal, numImag);
}
Это действительно работает для базового ввода. Но он не очень быстрый или читаемый или полезный. И он охватывает только несколько возможностей ввода (такие вещи, как «-3 - 5,14», не работают). Есть ли более простой способ преобразовать строку в комплексное число, не имея столько циклов и переменных?
Спасибо за код, –
** Что станд :: istringstream ISS (ул) ; делать? (sry for double post) –
YVW Создает 'std :: istringstream' из' std :: string', который затем повторяется с использованием итератора регулярных выражений. – wally