예제 #1
0
파일: decimal.cpp 프로젝트: cs-wang/CLAIMS
bool Decimal::StrtoDecimal(int p, int s, const char *cp)
{
	bool		have_dp = false;
	int			i = 0;
    char decdigits[DECIMAL_MAXPRCISION+1];
	char num1[31];
    int dsign = DECIMAL_POS;
    int dweight = -1;
	const char *str = cp;
	
	memset(decdigits, '0', DECIMAL_MAXPRCISION+1);
	num1[0] = '1';
	memset(num1+1, '0', 30);
	
	while (isspace(*cp))
		cp++;
	//printf("source :%s\n",cp);
	switch (*cp)
	{
		case '+':
			cp++;
			break;
		case '-':
			dsign = DECIMAL_NEG;
			cp++;
			break;
	}

	while (*cp)
	{
		if (isdigit((unsigned char) *cp))
		{
			decdigits[i++] = *cp++;
			if (!have_dp)
				dweight++;
		}
		else if (*cp == '.')
		{
			if (have_dp)
			{
				printf("invalid input syntax for type numeric: \"%s\"\n", str);
				return false;
			}
			have_dp = true;
			cp++;
		}
		else
			break;
	}
	if (*cp == 'e' || *cp == 'E')
	{
		long		exponent;
		char	   *endptr;
		cp++;
		exponent = strtol(cp, &endptr, 10);
		if (endptr == cp)
		{
			printf("invalid input syntax for type numeric: \"%s\"\n", str);
			return false;
		}
		cp = endptr;
		dweight += (int) exponent;
	}
	if (dweight > p - s )
	{
		printf("invalid input syntax for type numeric: \"%s\"\n",	str);
		return false;
	}
	while (*cp)
	{
		if (isspace((unsigned char) *cp))
		{
			cp++;
		}
		else
		{
			printf("invalid input syntax for type numeric: \"%s\"\n",  str);
			return false;
		}
	}

	decdigits[DECIMAL_MAXSCALE + dweight + 1] = 0;
	char c = decdigits[s + dweight + 1];
	memset(decdigits + s + dweight + 1, '0', DECIMAL_MAXSCALE - s);
	TTInt whole(decdigits);
	
	num1[30 - s + 1] = 0;
	TTInt fra(num1);

	if (DECIMAL_NEG == dsign)
	{
		fra.SetSign();
		whole.SetSign();
	}
	SetTTInt((c>='5'?whole+fra:whole));	
	return true;
}
예제 #2
0
static getra(void)
{
  return fra(3);
}