예제 #1
0
        static private void SetFromString(BigNumber atm, String value, bool isStrainghtDigitsOnly = false)
        {
            SetZero(atm);

            int   p        = 0;
            sbyte sign     = 1;
            int   exponent = 0;

            if (isStrainghtDigitsOnly == false)
            {
                value = value.Trim();               // trim whitespace
                value = value.ToLower();            // convert to lower
                //value = UtilityHandler.ToLowerFast(value);

                int cp = value.IndexOf("0x");       // hexadezimalnumber
                if (cp >= 0)
                {
                    value = value.Substring(cp + 2, value.Length - (cp + 2));
                    BigNumber.SetFromHexString(atm, value);
                    return;
                }

                cp = value.IndexOf("%");       // binary format number
                if (cp >= 0)
                {
                    value = value.Substring(cp + 1, value.Length - (cp + 1));
                    BigNumber.SetFromBinaryString(atm, value);
                    return;
                }

                cp = value.IndexOf("e");
                if (cp > 0) // e cannot be leading
                {
                    String ex = value.Substring(cp + 1, value.Length - (cp + 1));
                    exponent = Convert.ToInt32(ex);
                    value    = value.Substring(0, cp);
                }
            }



            if (value.Contains("+"))
            {
                value = value.Replace("+", ""); // remove optional '+' character
            }
            else if (value.Contains("-"))
            {
                sign  = -1;
                value = value.Replace("-", "");
            }

            value = value.Replace(",", ".");

            int j = value.IndexOf(".");

            if (j == -1)
            {
                value = value + '.';
                j     = value.IndexOf(".");
            }

            if (j > 0)
            {
                exponent += j;
                value     = value.Replace(".", "");
            }


            int i = value.Length;

            atm.dataLength = i;

            if ((i % 2) != 0)
            {
                value = value + '0';
            }

            j = value.Length >> 1;

            if (value.Length > atm.mantissa.Length)
            {
                BigNumber.Expand(atm, atm.dataLength + 28);
            }


            byte ch = 0;

            int zflag = 1;

            for (i = 0, p = 0; i < j; i++)
            {
                ch = (byte)(value[p++] - '0');

                if ((ch = (byte)((byte)(10 * ch) + (byte)(value[p++] - '0'))) != 0)
                {
                    zflag = 0;
                }

                if (((int)ch & 0xFF) >= 100)
                {
                    // Error!
                    SetZero(atm);
                    return;
                }

                atm.mantissa[i]     = ch;
                atm.mantissa[i + 1] = 0;
            }

            atm.exponent = exponent;
            atm.signum   = sign;

            if (zflag != 0)
            {
                atm.exponent    = 0;
                atm.signum      = 0;
                atm.dataLength  = 1;
                atm.mantissa[0] = 0;
            }
            else
            {
                Normalize(atm);
            }
        }