tr1bls
Гость
|
|
« : Март 05, 2017, 10:16 » |
|
Имеется QLineEdit, в который через пробел вводятся вещественные числа. Каким образом можно заполнить массив действительных чисел числами из этой строки?
|
|
|
Записан
|
|
|
|
vic57
Чайник
Offline
Сообщений: 90
|
|
« Ответ #1 : Март 05, 2017, 13:12 » |
|
C++ (Qt) QStringList l = lineEdit.text().split(" "); QVector<double> v; QString s; foreach(s,l) v += s.toDouble();
|
|
|
Записан
|
|
|
|
titan83
Гость
|
|
« Ответ #2 : Март 05, 2017, 15:38 » |
|
vic57, ваше решение абсолютно рабочее, но все же предложу свое без foreach (который уже давненько deprecated) и с C++11 (который уже неплохо бы использовать). QLineEdit* editor = new QLineEdit(); QVector<double> v; editor->setText("6.488 -5 0.995"); for (QString number : editor->text().split(' ')) v.append(number.toDouble()); qDebug() << "text" << editor->text() << "array" << v; delete(editor);
|
|
|
Записан
|
|
|
|
Igors
|
|
« Ответ #3 : Март 10, 2017, 15:18 » |
|
vic57, ваше решение абсолютно рабочее, но все же предложу свое без foreach (который уже давненько deprecated) и с C++11 (который уже неплохо бы использовать). QLineEdit* editor = new QLineEdit(); QVector<double> v; editor->setText("6.488 -5 0.995"); for (QString number : editor->text().split(' ')) v.append(number.toDouble()); qDebug() << "text" << editor->text() << "array" << v; delete(editor);
Допустим юзер где-то ошибся напр в одном числе запятая вместо точки. Хорошо бы дать ему от ворот поворот и подсветить в QLineEdit это калечное число. Будет ли решение на С++ 11 выразительнее и/или лаконичнее? Или практически такое же как на С++ 99 ?
|
|
|
Записан
|
|
|
|
__Heaven__
|
|
« Ответ #4 : Март 10, 2017, 15:54 » |
|
А мой вариант был бы C++ (Qt) QVector<double> result; for (const QString &strValue: lineEdit->text().split(' ')) { result << strValue.toDouble(); }
А для всякого рода проверок завёл бы валидатор lineEdit.
|
|
|
Записан
|
|
|
|
Пантер
|
|
« Ответ #5 : Март 10, 2017, 16:00 » |
|
Как после Пайтона не хватает вот такого синтаксиса: C++ (Qt) const auto result = [s.toDouble() for s in lineEdit->text().split(' ')]
|
|
|
Записан
|
1. Qt - Qt Development Frameworks; QT - QuickTime 2. Не используйте в исходниках символы кириллицы!!! 3. Пользуйтесь тегом code при оформлении сообщений.
|
|
|
__Heaven__
|
|
« Ответ #6 : Март 10, 2017, 16:57 » |
|
Wut?!
|
|
|
Записан
|
|
|
|
kambala
|
|
« Ответ #7 : Март 10, 2017, 17:23 » |
|
Как после Пайтона не хватает вот такого синтаксиса: C++ (Qt) const auto result = [s.toDouble() for s in lineEdit->text().split(' ')]
можно blockingMap из QtConcurrent заюзать
|
|
|
Записан
|
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
|
|
|
Пантер
|
|
« Ответ #8 : Март 10, 2017, 18:47 » |
|
Wut?!
Я о том, что в Пайтоне очень красиво такая задача бы решалась: Python s = '1.5 2.6 3.7 4.8' result = [float(i) for i in s.split(' ')]
|
|
|
Записан
|
1. Qt - Qt Development Frameworks; QT - QuickTime 2. Не используйте в исходниках символы кириллицы!!! 3. Пользуйтесь тегом code при оформлении сообщений.
|
|
|
__Heaven__
|
|
« Ответ #9 : Март 10, 2017, 21:48 » |
|
Я понял С непривычки синтаксис выглядит как "чё за хрень здесь творится!?" А так да, человекочитабельненько
|
|
|
Записан
|
|
|
|
titan83
Гость
|
|
« Ответ #10 : Март 12, 2017, 15:26 » |
|
vic57, ваше решение абсолютно рабочее, но все же предложу свое без foreach (который уже давненько deprecated) и с C++11 (который уже неплохо бы использовать). QLineEdit* editor = new QLineEdit(); QVector<double> v; editor->setText("6.488 -5 0.995"); for (QString number : editor->text().split(' ')) v.append(number.toDouble()); qDebug() << "text" << editor->text() << "array" << v; delete(editor);
Допустим юзер где-то ошибся напр в одном числе запятая вместо точки. Хорошо бы дать ему от ворот поворот и подсветить в QLineEdit это калечное число. Будет ли решение на С++ 11 выразительнее и/или лаконичнее? Или практически такое же как на С++ 99 ? C++11 будет лаконичнее однозначно. Взять хотя бы лямбды, можно сразу убрать одноразовые слоты длиной в одну-две строки.
|
|
|
Записан
|
|
|
|
Igors
|
|
« Ответ #11 : Март 17, 2017, 11:06 » |
|
Допустим юзер где-то ошибся напр в одном числе запятая вместо точки. Хорошо бы дать ему от ворот поворот и подсветить в QLineEdit это калечное число. Будет ли решение на С++ 11 выразительнее и/или лаконичнее? Или практически такое же как на С++ 99 ?
C++11 будет лаконичнее однозначно. Прошу исполнить Я о том, что в Пайтоне очень красиво такая задача бы решалась: Python s = '1.5 2.6 3.7 4.8' result = [float(i) for i in s.split(' ')]
И если слово не float?
|
|
|
Записан
|
|
|
|
Пантер
|
|
« Ответ #12 : Март 17, 2017, 11:53 » |
|
Упадет эксепшен.
|
|
|
Записан
|
1. Qt - Qt Development Frameworks; QT - QuickTime 2. Не используйте в исходниках символы кириллицы!!! 3. Пользуйтесь тегом code при оформлении сообщений.
|
|
|
titan83
Гость
|
|
« Ответ #13 : Март 17, 2017, 20:23 » |
|
Допустим юзер где-то ошибся напр в одном числе запятая вместо точки. Хорошо бы дать ему от ворот поворот и подсветить в QLineEdit это калечное число. Будет ли решение на С++ 11 выразительнее и/или лаконичнее? Или практически такое же как на С++ 99 ?
C++11 будет лаконичнее однозначно. Прошу исполнить QLineEdit edit; edit.setText("lox 123 4,5 lox100500 -34.66"); QStringList numbersList, elementsList; QRegularExpressionMatchIterator i = QRegularExpression("(?<!\\S)([-]?\\d+[.,]?\\d*)(?!\\S)").globalMatch(edit.text()); while (i.hasNext()) numbersList.append(i.next().captured(1)); i = QRegularExpression("(\\S+)").globalMatch(edit.text()); while (i.hasNext()) elementsList.append(i.next().captured(1)); for (auto element : elementsList) if (numbersList.contains(element) == false) qDebug() << "bad" << element;
|
|
|
Записан
|
|
|
|
kambala
|
|
« Ответ #14 : Март 18, 2017, 12:15 » |
|
щас тема опять скатится в обсуждение «регулярки/спирит vs велосипед-токенайзер»
|
|
|
Записан
|
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
|
|
|
|