浮点数字符串转换成浮点数实现

        之前面试的时候,常给面试者出的一个面试题目是,给定一个字符串,输出该字符串表示的浮点数的值,要求如下:

        写一个转换函数,该函数的输入是一个表示浮点数的字符串,把该字符串转换成浮点数并输出。条件:请考虑各种情况,并且代码中的循环尽量少,不能调用API或者crt库中的函数。例如:输入字符串"345.7",则输出浮点数345.7。接口可以为:float StrToFloatA(TCHAR* pstrfloat);

        没想到完全做对这个题目的人居然不多(上机笔试,函数写好之后丢到测试机里面跑一下看是否完全正确),因此自己在空闲时间实现了一下,确实还是有一点难度的。代码如下:

/* -------------------------------------------------------------------------
//	文件名		:	StringToFloat.h
//	创建者		:	magictong
//	创建时间	:	2011-9-6 14:14:25
//	功能描述	:	
//
//	$Id: $
// -----------------------------------------------------------------------*/
#ifndef __STRINGTOFLOAT_H__
#define __STRINGTOFLOAT_H__

// -------------------------------------------------------------------------
float StrToFloatW(wchar_t* pstrfloat);
float StrToFloatA(char* pstrfloat);

#if defined(UNICODE) || defined(_UNICODE)
	#define StrToFloat  StrToFloatW
#else
	#define StrToFloat  StrToFloatA
#endif // !UNICODE
// -------------------------------------------------------------------------
// $Log: $

#endif /* __STRINGTOFLOAT_H__ */


/* -------------------------------------------------------------------------
//	文件名		:	StringToFloat.cpp
//	创建者		:	magictong
//	创建时间	:	2011-9-6 14:14:02
//	功能描述	:	
//
//	$Id: $
// -----------------------------------------------------------------------*/

#include "stdafx.h"
#include "StringToFloat.h"

// -------------------------------------------------------------------------

#pragma warning(disable:4244)
// -------------------------------------------------------------------------
// 函数		: StrToFloatA
// 功能		: 将一个字符串转换为浮点数
// 返回值	: float 
// 参数		: char* pstrfloat
// 附注		: 
// -------------------------------------------------------------------------
float StrToFloatA(char* pstrfloat)
{
	// check
	if (!pstrfloat)
	{
		return 0.0;
	}

	bool bNegative = false;
	bool bDec = false;

	char* pSor = 0;
	char chByte = '0';
	float fInteger = 0.0;
	float fDecimal = 0.0;
	float fDecPower = 0.1f;

	// 进行首位判断,判断是否是负数
	if (pstrfloat[0] == '-')
	{
		bNegative = true;
		pSor = pstrfloat + 1;
	}
	else
	{
		bNegative = false;
		pSor = pstrfloat;
	}

	while (*pSor != '\0')
	{
		chByte = *pSor;

		if (bDec)
		{
			// 小数
			if (chByte >= '0' && chByte <= '9')
			{
				fDecimal += (chByte - '0') * fDecPower;
				fDecPower = fDecPower * 0.1;
			}
			else
			{
				return (bNegative? -(fInteger +  fDecimal): fInteger + fDecimal);
			}
		}
		else
		{
			// 整数
			if (chByte >= '0' && chByte <= '9')
			{
				fInteger = fInteger * 10.0 + chByte - '0';
			}
			else if (chByte == '.')
			{
				bDec = true;
			}
			else
			{
				return (bNegative? -fInteger : fInteger);
			}
		}

		pSor++;
	}

	return (bNegative? -(fInteger +  fDecimal): fInteger + fDecimal);
}

// -------------------------------------------------------------------------
// 函数		: StrToFloatW
// 功能		: 将一个字符串转换为浮点数
// 返回值	: float 
// 参数		: char* pstrfloat
// 附注		: 
// -------------------------------------------------------------------------
float StrToFloatW(wchar_t* pstrfloat)
{
	// check
	if (!pstrfloat)
	{
		return 0.0;
	}

	bool bNegative = false;
	bool bDec = false;

	wchar_t* pSor = 0;
	wchar_t chByte = L'0';
	float fInteger = 0.0;
	float fDecimal = 0.0;
	float fDecPower = 0.1f;

	// 进行首位判断,判断是否是负数
	if (pstrfloat[0] == L'-')
	{
		bNegative = true;
		pSor = pstrfloat + 1;
	}
	else
	{
		bNegative = false;
		pSor = pstrfloat;
	}

	while (*pSor != L'\0')
	{
		chByte = *pSor;

		if (bDec)
		{
			// 小数
			if (chByte >= L'0' && chByte <= L'9')
			{
				fDecimal += (chByte - L'0') * fDecPower;
				fDecPower = fDecPower * 0.1;
			}
			else
			{
				return (bNegative? -(fInteger +  fDecimal): fInteger + fDecimal);
			}
		}
		else
		{
			// 整数
			if (chByte >= L'0' && chByte <= L'9')
			{
				fInteger = fInteger * 10.0 + chByte - L'0';
			}
			else if (chByte == L'.')
			{
				bDec = true;
			}
			else
			{
				return (bNegative? -fInteger : fInteger);
			}
		}

		pSor++;
	}

	return (bNegative? -(fInteger +  fDecimal): fInteger + fDecimal);
}
// -------------------------------------------------------------------------
// $Log: $

        测试用例:

// StringToFloatShell.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "StringToFloat.h"


int _tmain(int argc, _TCHAR* argv[])
{	
	float aaaa = 0;
	aaaa = StrToFloat(L"12.34");
	aaaa = StrToFloat(L"a23");
	aaaa = StrToFloat(L"1234");
	aaaa = StrToFloat(L"12.34");
	aaaa = StrToFloat(L"12.34.56");
	aaaa = StrToFloat(L".34");
	aaaa = StrToFloat(L"34a");
	aaaa = StrToFloat(L"34a.456");
	aaaa = StrToFloat(L"-34");
	aaaa = StrToFloat(L"-56.34");
	aaaa = StrToFloat(L"-3.45.67");
	aaaa = StrToFloat(L"-.45.6a");
	aaaa = StrToFloat(L"-.");
	aaaa = StrToFloat(L"-0");
	return 0;
}


        大家可以再找找BUG。

        [END]


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值