字符串转化为浮点数据的函数

本文介绍了一种自定义的字符串转浮点数的方法,通过分析输入字符串来逐位解析并转换为浮点数,避免了使用标准库函数atof带来的额外依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常用到字符串转化为浮点数据的函数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;
}
 
<think>我们正在处理用户的问题:如何将字符串转换为浮点型,特别是在PostgreSQL中。 根据用户的问题,我们需要提供在PostgreSQL中将字符串转换为浮点数的方法。 在PostgreSQL中,我们可以使用CAST函数或者::操作符来进行类型转换。 例如: 使用CAST: CAST('123.45' AS FLOAT) 使用::操作符: '123.45'::FLOAT 注意:在PostgreSQL中,FLOAT类型对应的是浮点数,但具体有FLOAT4(单精度)和FLOAT8(双精度)两种。通常,我们可以使用FLOAT,但也可以明确指定精度。 另外,PostgreSQL还提供了to_number函数,它可以根据指定的格式将字符串转换为数字,但通常用于格式化字符串(如货币字符串)的转换。 但是,如果只是简单的字符串浮点数,使用CAST或::操作符是最直接的方法。 我们还需要注意,如果字符串不是有效的数字表示,转换会抛出错误。为了避免错误,可以使用错误处理机制(如TRY_CAST),但PostgreSQL本身不提供TRY_CAST,我们可以通过创建函数来实现类似功能,或者使用CASE语句配合正则表达式先检查字符串是否合法。 不过,用户的问题没有涉及错误处理,所以我们先提供基本转换方法。 根据引用[2]中提到的,PostgreSQL中浮点数类型有float4(单精度)和float8(双精度)。我们通常使用float8,因为它具有更高的精度。 因此,我们可以这样转换: SELECT '123.456'::float8; SELECT CAST('123.456' AS float8); 如果用户想转换为单精度浮点数,则使用float4。 现在,我们按照要求生成相关问题。</think>### PostgreSQL 字符串浮点型方法 在 PostgreSQL 中将字符串转换为浮点数主要有以下两种方法: #### 1. 使用 `CAST` 函数 ```sql SELECT CAST('123.45' AS FLOAT); -- 双精度浮点数 SELECT CAST('123.45' AS REAL); -- 单精度浮点数 ``` #### 2. 使用 `::` 类型转换操作符(更简洁) ```sql SELECT '123.45'::FLOAT; -- 双精度浮点数 SELECT '123.45'::REAL; -- 单精度浮点数 SELECT '123.45'::FLOAT4; -- 单精度(float4) SELECT '123.45'::FLOAT8; -- 双精度(float8)[^2] ``` #### 3. 特殊场景处理 ```sql -- 处理带格式的字符串(如货币符号) SELECT to_number('$1,234.56', 'L9G999D99')::FLOAT; -- 安全转换(避免无效字符报错) SELECT NULLIF(regexp_replace('123abc', '[^0-9.]', '', 'g'), '')::FLOAT; ``` > **重要提示**: > - 单精度(`FLOAT4/REAL`)精度约6-9位,双精度(`FLOAT8/FLOAT`)精度约15位[^2] > - 转换失败会抛出错误,需提前验证数据有效性 > - 科学计数法字符串(如`'1.23E-4'`)可直接转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值