atof.c 2.08 KB
/*
=============================================================================
        Copyright (C) 1997-1999 NINTENDO Co.,Ltd.
        
        $RCSfile: atof.c,v $
        $Revision: 1.1.1.1 $
        $Date: 2002/10/30 02:07:09 $
=============================================================================
関数名:atof
-----------------------------------------------------------------------------
書式:  #include <stdlib.h>
        double atof(const char *string);
引数:  string  文字列
戻り値:double 型の数値
説明:  string 文字列を double 型の数値に変換する。

        文字列 stringは、次の形式で指定する。

        [whitespace][{sign}][digits][.digits][{e | E}[sign]digits]

            <whitespace>    空白類文字 (isspace 参照)
            <sign>          +か−
            <digits>        1桁以上の10進文字列

        10進数値の後には、e、Eに続く指数部をつけられる。
        数字の一部として認識出来ない文字が現れたところで変換を打ち切る。
-----------------------------------------------------------------------------
*/
#include    "stdlib.h"
#include    "math.h"
#include    "ctype.h"

double atof(const char *string)
{
    double a = 1.0, b = 0.0,  c = 0;

    while(isspace(*string))
      string++;
    
    if (!*string)   return  0.0;
    if (*string == '+') string++;
    if (*string == '-') {string++; a = -1.0;}
    while(*string)  {
        if (*string == '.') {
            if (b)  break;
            b = 10.0;
            string++;
        }   else    {
            if (!isdigit(*string))  break;
            if (b)  {
                c += ((*string++ - '0') / b);
                b *= 10.0;
            }   else    {
                c *= 10.0;
                c += (*string++) - '0';
            }
        }
    }
    c *= a;

    if (*string == 'E' || *string == 'e')   {
        string++;
        a = b = 0;
        if (*string == '+') string++;
        if (*string == '-') {string++; a = 1.0;}

        while(isdigit(*string)) {
            b *= 10;
            b += (*string++) - '0';
        }
        b = pow(10, b);
        if (a)  c /= b;
        else    c *= b;
    }
    return  c;
}