string to float conversion?

前端 未结 9 1830
-上瘾入骨i
-上瘾入骨i 2020-12-18 14:16

I\'m wondering what sort of algorithm could be used to take something like \"4.72\" into a float data type, equal to

float x = 4.72;
相关标签:
9条回答
  • 2020-12-18 14:44

    For C++ This is the algorithm I use:

    bool FromString(const string& str, double& number) {
    
        std::istringstream i(str);
    
        if (!(i >> number)) {
            // Number conversion failed
            return false;
        }
    
        return true;
    }
    

    I used atof() in the past for the conversion, but I found this problematic because if no valid conversion can be made, it will return (0.0). So, you would not know if it failed and returned zero, or if the string actually had "0" in it.

    0 讨论(0)
  • 2020-12-18 14:44

    You can use boost:lexical_cast

    http://www.boost.org/doc/libs/1_44_0/libs/conversion/lexical_cast.htm

    0 讨论(0)
  • 2020-12-18 14:50

    For C++ you can use boost::lexical_cast:

       std::string str( "4.72" );
       float x = boost::lexical_cast< float >( str );
    

    For C you can use sscanf:

       char str[]= "4.72";
       float x;
       sscanf( str, "%f", &x );
    
    0 讨论(0)
  • 2020-12-18 14:50

    For C strtod() and C99 friends strtof() and strtold() (description on same link) already have that algorithm implemented.

    If you are having problems writing your own, post your code and specific questions about it.

    0 讨论(0)
  • 2020-12-18 14:50

    As you've asked for an algorithm, not a method, here is my explanation for a simple algorithm (and an implementation in C):

    1. Initialize 4 integer variables, one for the value before dot, one for the after part, one for the power of the mantissa, one for the sign. Let's say, f, m, d, sign = 1.
    2. First look for + or - sign at the beginning. If there are no sign characters or + sign then continue. If the first character is -, then sign = -1.
    3. Then, read an integer value into f until a . or NULL character.
    4. If you end up with a dot character, then start reading the mantissa part as in the previous step into m. But this time also multiply d by 10 with each digit.
    5. In the end, return sign*(f + (float) m/d). The casting makes sure the division is done in floating-points and the type of the expression is float.

    I guess, reading the code might be easier. So here is the code:

    float atof(char *s)
    {
        int f, m, sign, d=1;
        f = m = 0;
    
        sign = (s[0] == '-') ? -1 : 1;
        if (s[0] == '-' || s[0] == '+') s++;
    
        for (; *s != '.' && *s; s++) {
                f = (*s-'0') + f*10;
        }
        if (*s == '.')
                for (++s; *s; s++) {
                        m = (*s-'0') + m*10;
                        d *= 10;
                }
        return sign*(f + (float)m/d);
    }
    
    0 讨论(0)
  • The atof() function can be helpful. http://www.cplusplus.com/reference/clibrary/cstdlib/atof/

    0 讨论(0)
提交回复
热议问题