2011-07-21 91 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。 –

相关问题