常用到字符串转化为浮点数据的函数atof
但编译之后需要带一个很大的运行库,于是自己编了一个:
#define IsDigit(c) ((c) >= TEXT('0') && (c) <= TEXT('9'))
//将字符串转换成浮点数据,返回成功转换的字符数
int WINAPI ToDouble(LPCTSTR lpString, double *value)
{
int nStrLen, nStart, nEnd, nPos, sign = 1, n, flag = 1;
double radix;
nStrLen = lstrlen(lpString);
//找到第一个数字位置
for(nPos = 0, *value = 0; nPos < nStrLen && !IsDigit(lpString[nPos]); nPos++);
if(nPos == nStrLen) return 0;
nStart = nEnd = nPos;
if(nStart > 0)
{
if(lpString[nStart-1] == TEXT('.'))
{
nStart--;
flag = 0;
if(nStart > 0 && lpString[nStart-1] == TEXT('-'))
{
nStart--;
sign = -1;
}
}
else if(lpString[nStart-1] == TEXT('-'))
{
nStart--;
sign = -1;
}
}
//找到连续的最后一个数字位置
for(; nPos < nStrLen && IsDigit(lpString[nPos]); nPos++);
if(flag)
{
for(radix = 1, n = nPos - 1; n >= nEnd; n--)
{
*value += (lpString[n] - TEXT('0')) * radix;
radix *= 10;
}
nEnd = nPos -1;
if(nPos < nStrLen-1 && lpString[nPos] == TEXT('.') && IsDigit(lpString[nPos+1]))
{
nPos++;
nEnd = nPos;
for(; nPos < nStrLen && IsDigit(lpString[nPos]); nPos++);
for(radix = 0.1, n = nEnd; n < nPos; n++)
{
*value += (lpString[n] - TEXT('0')) * radix;
radix *= 0.1;
}
nEnd = nPos -1;
}
}
else
{
for(radix = 0.1, n = nEnd; n < nPos; n++)
{
*value += (lpString[n] - TEXT('0')) * radix;
radix *= 0.1;
}
nEnd = nPos -1;
}
*value *= sign;
return nEnd - nStart +1;
}
但编译之后需要带一个很大的运行库,于是自己编了一个:
#define IsDigit(c) ((c) >= TEXT('0') && (c) <= TEXT('9'))
//将字符串转换成浮点数据,返回成功转换的字符数
int WINAPI ToDouble(LPCTSTR lpString, double *value)
{
int nStrLen, nStart, nEnd, nPos, sign = 1, n, flag = 1;
double radix;
nStrLen = lstrlen(lpString);
//找到第一个数字位置
for(nPos = 0, *value = 0; nPos < nStrLen && !IsDigit(lpString[nPos]); nPos++);
if(nPos == nStrLen) return 0;
nStart = nEnd = nPos;
if(nStart > 0)
{
if(lpString[nStart-1] == TEXT('.'))
{
nStart--;
flag = 0;
if(nStart > 0 && lpString[nStart-1] == TEXT('-'))
{
nStart--;
sign = -1;
}
}
else if(lpString[nStart-1] == TEXT('-'))
{
nStart--;
sign = -1;
}
}
//找到连续的最后一个数字位置
for(; nPos < nStrLen && IsDigit(lpString[nPos]); nPos++);
if(flag)
{
for(radix = 1, n = nPos - 1; n >= nEnd; n--)
{
*value += (lpString[n] - TEXT('0')) * radix;
radix *= 10;
}
nEnd = nPos -1;
if(nPos < nStrLen-1 && lpString[nPos] == TEXT('.') && IsDigit(lpString[nPos+1]))
{
nPos++;
nEnd = nPos;
for(; nPos < nStrLen && IsDigit(lpString[nPos]); nPos++);
for(radix = 0.1, n = nEnd; n < nPos; n++)
{
*value += (lpString[n] - TEXT('0')) * radix;
radix *= 0.1;
}
nEnd = nPos -1;
}
}
else
{
for(radix = 0.1, n = nEnd; n < nPos; n++)
{
*value += (lpString[n] - TEXT('0')) * radix;
radix *= 0.1;
}
nEnd = nPos -1;
}
*value *= sign;
return nEnd - nStart +1;
}