to_int()
public
Returns the value as an integer (Fixnum or Bignum).
If the BigNumber is infinity or NaN, returns nil.
static VALUE
BigDecimal_to_i(VALUE self)
{
ENTER(5);
int e,n,i,nf;
U_LONG v,b,j;
volatile VALUE str;
char *psz,*pch;
Real *p;
GUARD_OBJ(p,GetVpValue(self,1));
BigDecimal_check_num(p);
e = VpExponent10(p);
if(e<=0) return INT2FIX(0);
nf = VpBaseFig();
if(e<=nf) {
e = VpGetSign(p)*p->frac[0];
return INT2FIX(e);
}
str = rb_str_new(0, e+nf+2);
psz = RSTRING_PTR(str);
n = (e+nf-1)/nf;
pch = psz;
if(VpGetSign(p)<0) *pch++ = '-';
for(i=0;i<n;++i) {
b = VpBaseVal()/10;
if(i>=(int)p->Prec) {
while(b) {
*pch++ = '0';
b /= 10;
}
continue;
}
v = p->frac[i];
while(b) {
j = v/b;
*pch++ = (char)(j + '0');
v -= j*b;
b /= 10;
}
}
*pch++ = 0;
return rb_cstr2inum(psz,10);
}