Tôi có một số QString
trong các nguồn của mình. Vì vậy, tôi cần phải chuyển đổi nó thành số nguyên không có "Kb".Làm thế nào để chuyển đổi QString thành int?
Tôi đã thử Abcd.toInt()
nhưng nó không hoạt động.
QString Abcd = "123.5 Kb"
Tôi có một số QString
trong các nguồn của mình. Vì vậy, tôi cần phải chuyển đổi nó thành số nguyên không có "Kb".Làm thế nào để chuyển đổi QString thành int?
Tôi đã thử Abcd.toInt()
nhưng nó không hoạt động.
QString Abcd = "123.5 Kb"
Chuỗi bạn có ở đây chứa số dấu chấm động với đơn vị. Tôi khuyên bạn nên tách chuỗi đó thành một số và phần đơn vị với QString::split()
.
Sau đó, sử dụng toDouble()
để nhận số dấu chấm động và làm tròn theo ý muốn.
Bạn không có tất cả các ký tự chữ số trong chuỗi của mình. Vì vậy, bạn phải chia bởi không gian
QString Abcd = "123.5 Kb";
Abcd.split(" ")[0].toInt(); //convert the first part to Int
Abcd.split(" ")[0].toDouble(); //convert the first part to double
Abcd.split(" ")[0].toFloat(); //convert the first part to float
Cập nhật: Tôi cập nhật câu trả lời cũ. Đó là một câu trả lời thẳng về phía trước cho câu hỏi cụ thể, với một giả định nghiêm ngặt. Tuy nhiên như ghi nhận bởi @DomTomCat trong ý kiến và @Mikhail trong câu trả lời, Nói chung người ta phải luôn luôn kiểm tra xem các hoạt động thành công hay không. Vì vậy, việc sử dụng cờ boolean là cần thiết.
bool flag;
double v = Abcd.split(" ")[0].toDouble(&flag);
if(flag){
// use v
}
Ngoài ra nếu bạn đang dùng chuỗi đó làm đầu vào của người dùng, bạn cũng nên nghi ngờ về việc chuỗi có thực sự chia tách với không gian hay không. Nếu có khả năng giả định có thể bị phá vỡ thì một trình xác minh regex sẽ thích hợp hơn. Một regex như sau sẽ trích xuất giá trị dấu chấm động và ký tự tiền tố của 'b'. Sau đó, bạn có thể chuyển đổi một cách an toàn các chuỗi đã ghi để tăng gấp đôi.
([0-9]*\.?[0-9]+)\s+(\w[bB])
Bạn có thể có một chức năng tiện ích như sau
QPair<double, QString> split_size_str(const QString& str){
QRegExp regex("([0-9]*\\.?[0-9]+)\\s+(\\w[bB])");
int pos = regex.indexIn(str);
QStringList captures = regex.capturedTexts();
if(captures.count() > 1){
double value = captures[1].toDouble(); // should succeed as regex matched
QString unit = captures[2]; // should succeed as regex matched
return qMakePair(value, unit);
}
return qMakePair(0.0f, QString());
}
Mặc dù câu trả lời này là phù hợp với ví dụ cụ thể của người hỏi, tôi đang thiếu kiểm tra thành công câu trả lời của @ Mikhail. – DomTomCat
Vâng, đó là chính xác.Đó là một lớp lót.Nhưng có một nên luôn luôn xác minh các hoạt động như vậy –
Trên bình luận:
sscanf(Abcd, "%f %s", &f,&s);
Cung cấp cho một lỗi.
Đây là đúng cách:
sscanf(Abcd, "%f %s", &f,qPrintable(s));
OP hỏi về Qt, và sscanf không phải là Qt –
Như một gợi ý, bạn cũng có thể sử dụng QChar::digitValue()
để có được những giá trị số của chữ số. Ví dụ:
for (int var = 0; var < myString.length(); ++var) {
bool ok;
if (myString.at(var).isDigit()){
int digit = myString.at(var).digitValue();
//DO SOMETHING HERE WITH THE DIGIT
}
}
Đừng quên kiểm tra xem việc chuyển đổi đã thành công!
bool ok;
auto str= tr("1337");
str.toDouble(&ok); // returns 1337.0, ok set to true
auto strr= tr("LEET");
strr.toDouble(&ok); // returns 0.0, ok set to false
Sử dụng .toInt()
cho int .toFloat()
cho phao và .toDouble()
cho đôi
Bạn có thể sử dụng:
QString str = "10";
int n = str.toInt();
Output:
n = 10
giống như hầu hết các câu trả lời đề xuất, đối với tôi nó là một phản hồi thừa. – eyllanesc
'sscanf (" 123,5 Kb ","% f% s ", &f,&s);' –
QString Abcd = "123,5 Kb"; float f; QString s; sscanf (Abcd, "% f% s", &f,&s); Lỗi: Không thể chuyển đổi "QString" thành "const char *" cho đối số "1" thành "int sscanf (const char *, const char *, ...)" – user2398614
123.5 không phải là số nguyên (ngay cả khi không có Kb) - bạn có chắc bạn muốn điều đó không? –