2013-05-19 12 views
42

मेरे पास मेरे स्रोतों में QString है। तो मुझे इसे "Kb" के बिना पूर्णांक में परिवर्तित करने की आवश्यकता है।QString से int को कैसे परिवर्तित करें?

मैंने Abcd.toInt() की कोशिश की लेकिन यह काम नहीं करता है।

QString Abcd = "123.5 Kb" 
+1

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

+0

क्यूस्ट्रिंग एबीसीडी = "123.5 Kb"; फ्लोट एफ; क्यूस्ट्रिंग एस; एसएसकेएनएफ (एबीसीडी, "% एफ% एस", &f,&s); त्रुटि: "क्यूस्ट्रिंग" को "कॉन्स्ट char *" में "1" से "int" sscanf (const char *, const char *, ...) " – user2398614

+1

123.5 में परिवर्तित नहीं किया जा सकता है एक पूर्णांक नहीं है (यहां तक ​​कि केबी के बिना) - क्या आप वाकई चाहते हैं? –

उत्तर

7

आपके पास यहां मौजूद स्ट्रिंग में एक इकाई के साथ एक फ़्लोटिंग पॉइंट नंबर होता है। मैं उस स्ट्रिंग को QString::split() के साथ एक संख्या और इकाई भाग में विभाजित करने की अनुशंसा करता हूं।

फिर toDouble() का उपयोग फ्लोटिंग पॉइंट नंबर और राउंड प्राप्त करने के लिए करें।

74

आपके पास अपनी स्ट्रिंग में सभी अंक वर्ण नहीं हैं। मैं एक पुराने जवाब को अद्यतन करने कर रहा हूँ: तो आप अंतरिक्ष

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 

अद्यतन द्वारा विभाजित करने के लिए है। सख्त धारणा के साथ, यह विशिष्ट प्रश्न का सीधा आगे जवाब था। हालांकि टिप्पणियों में @DomTomCat और उत्तर में @ मिखाइल द्वारा नोट किया गया है, सामान्य में हमेशा यह जांचना चाहिए कि ऑपरेशन सफल है या नहीं। तो एक बूलियन ध्वज का उपयोग करना आवश्यक है।

bool flag; 
double v = Abcd.split(" ")[0].toDouble(&flag); 
if(flag){ 
    // use v 
} 

इसके अलावा, अगर आप उपयोगकर्ता इनपुट के रूप में है कि स्ट्रिंग ले जा रहे हैं, तो आप के बारे में भी है कि क्या वास्तव में स्ट्रिंग अंतरिक्ष के साथ splitable है संदिग्ध होना चाहिए। यदि कोई संभावना है कि धारणा तोड़ सकती है तो एक रेगेक्स सत्यापनकर्ता अधिक बेहतर होता है। निम्नलिखित की तरह एक regex फ्लोटिंग बिंदु मान और 'बी' के उपसर्ग चरित्र निकालेगा। फिर आप कब्जे वाले तारों को दोबारा सुरक्षित रूप से परिवर्तित कर सकते हैं।

([0-9]*\.?[0-9]+)\s+(\w[bB]) 

आप निम्न

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

हालांकि यह उत्तर पूछताछ के विशिष्ट उदाहरण के लिए ठीक है, लेकिन मुझे @ मिखाइल के उत्तर की सफलता परीक्षा याद आ रही है, जिसे हमेशा जांचना चाहिए। – DomTomCat

+0

हां। यह सही है। यह एक लाइनर है। लेकिन हाँ किसी को हमेशा इस तरह के ऑपरेशंस को सत्यापित करना चाहिए –

-2

टिप्पणी पर की तरह एक उपयोगिता कार्य हो सकता है:

sscanf(Abcd, "%f %s", &f,&s); 

त्रुटि देता।

यह सही तरीका है:

sscanf(Abcd, "%f %s", &f,qPrintable(s)); 
+5

ओपी क्यूटी के बारे में पूछ रहा है, और एसएसकेएनएफ क्यूटी –

0

सुझाव के रूप में, आप भी QChar::digitValue() का उपयोग कर सकते अंकों की संख्यात्मक मान प्राप्त करने के लिए। उदाहरण के लिए:

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

स्रोत: Converting one element from a QString to int

5

भूल जाते हैं रूपांतरण सफल रहा था की जाँच करने के मत करो!

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

उपयोग .toInt() नाव के लिए पूर्णांक .toFloat() और .toDouble() डबल

toInt();

-1

आप उपयोग कर सकते के लिए के लिए:

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

आउटपुट:

n = 10 
+2

नहीं है जैसा कि अधिकांश उत्तरों का प्रस्ताव है, मेरे लिए यह एक अनावश्यक प्रतिक्रिया है। – eyllanesc

संबंधित मुद्दे