/*
功能:把浮点数字符串转换为浮点数。
本函数会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,
到出现非数字或字符串结束时('\0')才结束转换,并将结果返回。
若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。
参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分。如123.456或123e-2。
*/
double __fastcall my_wstrtod(const wchar_t* nptr, wchar_t** endptr)
{
register const wchar_t* p = nptr;
register long double value = 0.L;
int sign = 0;
long double factor;
unsigned int expo;
while (isspace(*p)) // 跳过前面的空格
p++;
if (*p == '-' || *p == '+')
sign = *p++; // 把符号赋给字符sign,指针后移。
// 处理数字字符
while ((unsigned int)(*p - '0') < 10u) // 转换整数部分
value = value * 10 + (*p++ - '0');
// 如果是正常的表示方式(如:1234.5678)
if (*p == '.')
{
factor = 1.;
p++;
while ((unsigned int)(*p - '0') < 10u)
{
factor *= 0.1;
value += (*p++ - '0') * factor;
}
}
// 如果是IEEE754标准的格式(如:1.23456E+3)
if ((*p | 32) == 'e')
{
expo = 0;
factor = 10.L;
switch (*++p)
{
case '-':
factor = 0.1;
case '+':
p++;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
break;
default:
// value = 0.L;
// p = nptr;
goto done;
}
while ((unsigned int)(*p - '0') < 10u)
expo = 10 * expo + (*p++ - '0');
while (1)
{
if (expo & 1)
value *= factor;
if ((expo >>= 1) == 0)
break;
factor *= factor;
}
}
done:
if (endptr != 0)
*endptr = (wchar_t*)p;
return (sign == '-' ? -value : value);
}
double __fastcall my_wtof(wchar_t* str)
{
return my_wstrtod(str, 0);
}
自定义函数my_wtof把浮点数字符串转换为浮点数(功能同_wtof)
最新推荐文章于 2023-10-28 14:28:42 发布