2011-07-21 71 views

回答

0

從焦炭取出點,然後
最簡單的,但不是最好使用atoi

見我的回答here,其他可能的方式。

+0

我試過了。 'atoi'只返回小數點前的部分。 – Smurf64

2

從字符串中刪除點炭和直接將其轉換爲int

0

作爲酸溶賽斯,使用的atoi,但與一捻,剝離期間的字符串並且使用的atoi的結果轉換爲INT。

1

是否存儲爲字符串(char*)?然後,你可以創建自己的解析器:

int flstrtoint(const char *str) { 
    int r = 0; 
    int i = strlen(str) - 1; 

    while (i >= 0) { 
     if (isdigit(str[i])) { 
      r *= 10 
      r += str[i] - `0`; 
     } 
     i--; 
    } 

    return r; 
} 

flstrtoint("35.28"); // should return 3528 
+0

> //應該返回3528 但是OP對於「35.28」和「35.280234」需要35280 – unkulunkulu

+0

這只是簡單地在末尾添加'* = 10;'而不是真正重要。或者首先計算點的位置,然後乘以正確的值。 – orlp

4

最小基礎代碼:

std::string s = "35.28"; 
s.erase(std::remove(s.begin(), s.end(), '.'), s.end()); //removing the dot 
std::stringstream ss(s); 
int value; 
ss >> value; 
value *= 10; 
std::cout << value; 

輸出:

35280 

在線演示:http://ideone.com/apRNP

這是基本的想法。你可以使用上面的代碼來使它更加靈活,以便它可以用於其他數字。


編輯:

這裏是一個靈活的解決方案:

int Convert(std::string s, int multiplier) 
{ 
    size_t pos = s.find('.'); 
    if (pos != std::string::npos) 
    { 
     pos = s.size() - (pos+1); 
     s.erase(std::remove(s.begin(), s.end(), '.'), s.end()); 
     while(pos) { multiplier /= 10; pos--; } 
    } 
    else 
     multiplier = 1; 
    std::stringstream ss(s); 
    int value; 
    ss >> value; 
    return value * multiplier; 
} 

測試代碼:

int main() { 
     std::cout << Convert("35.28", 1000) << std::endl; //35.28 -> 35280 
     std::cout << Convert("3.28", 1000) << std::endl; //3.28 -> 3280 
     std::cout << Convert("352.8", 1000) << std::endl; //352.8 -> 352800 
     std::cout << Convert("35.20", 1000) << std::endl; //35.20 -> 35200 
     std::cout << Convert("3528", 1000) << std::endl; //no change 
     return 0; 
} 

輸出:

35280 
3280 
352800 
35200 
3528 

在線演示:http://ideone.com/uCujP

+1

輸出中沒有任何一致性。 3528保持不變,而35.28變成35280. 1000沒有任何意義,它不代表信號位,它不保證小數的一致性。你到底想要保證什麼?不要讓小數點串(已經是int)乘以原來的乘數,而不是1。 –

相關問題