2013-05-19 37 views
42

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" 
+1

'sscanf (" 123,5 Kb ","% f% s ", &f,&s);' –

+0

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

+1

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? –

Trả lời

7

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.

74

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()); 
} 
+0

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

+0

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 –

-2

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)); 
+5

OP hỏi về Qt, và sscanf không phải là Qt –

0

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 
    } 
} 

Nguồn: Converting one element from a QString to int

5

Đừ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 
1

Sử dụng .toInt() cho int .toFloat() cho phao và .toDouble() cho đôi

toInt();

-1

Bạn có thể sử dụng:

QString str = "10"; 
int n = str.toInt(); 

Output:

n = 10 
+2

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

Các vấn đề liên quan