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; }
static getra(void) { return fra(3); }