[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 305
  • Last Modified:

Casting string to int in c# without conversion functions

Hi All,

How to convert a string to int in C# with out using Convert.ToInt32() or Int.Parse() conversion function.

Thanks in advance,
Badri Narayanan R
0
r_badris
Asked:
r_badris
1 Solution
 
Gautham JanardhanCommented:
string str = "1";
int i = (int)str;
0
 
DhaestCommented:
I don't think that it it possible to peform it without conversion ...
That would not stroke with the idea of OO-programming
0
 
Gautham JanardhanCommented:
s thats is not possible .. sorry i didnt test it...
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
DhaestCommented:
>> string str = "1";
>> int i = (int)str;

On this you'll get the error 'Cannot convert type string to int'
0
 
andrewjbCommented:
Why don't you want to use the two built-in conversion functions (!!)

You could parse the string 'by hand' if you wanted, character by character...

But this then sounds like homework..
0
 
Bob LearnedCommented:
Hmmm, maybe you could duplicate what the .NET framework does for Convert.ToInt32:

private static unsafe void StringToNumber(string str, NumberStyles options, ref NumberBuffer number, NumberFormatInfo info, bool parseDecimal)
{
    if (str == null)
    {
        throw new ArgumentNullException("String");
    }
    fixed (char* text = ((char*) str))
    {
        char* chPtr = text;
        char* chPtr2 = chPtr;
        if (!ParseNumber(ref chPtr2, options, ref number, info, parseDecimal) || ((((long) ((chPtr2 - chPtr) / 2)) < str.Length) && !TrailingZeros(str, (int) ((long) ((chPtr2 - chPtr) / 2)))))
        {
            throw new FormatException(Environment.GetResourceString("Format_InvalidString"));
        }
    }
}

 
private static unsafe bool ParseNumber(ref char* str, NumberStyles options, ref NumberBuffer number, NumberFormatInfo numfmt, bool parseDecimal)
{
    string currencyDecimalSeparator;
    string currencyGroupSeparator;
    char* chPtr2;
    number.scale = 0;
    number.sign = false;
    string currencySymbol = null;
    string ansiCurrencySymbol = null;
    string numberDecimalSeparator = null;
    string numberGroupSeparator = null;
    bool flag = false;
    if ((options & NumberStyles.AllowCurrencySymbol) != NumberStyles.None)
    {
        currencySymbol = numfmt.CurrencySymbol;
        if (numfmt.ansiCurrencySymbol != null)
        {
            ansiCurrencySymbol = numfmt.ansiCurrencySymbol;
        }
        numberDecimalSeparator = numfmt.NumberDecimalSeparator;
        numberGroupSeparator = numfmt.NumberGroupSeparator;
        currencyDecimalSeparator = numfmt.CurrencyDecimalSeparator;
        currencyGroupSeparator = numfmt.CurrencyGroupSeparator;
        flag = true;
    }
    else
    {
        currencyDecimalSeparator = numfmt.NumberDecimalSeparator;
        currencyGroupSeparator = numfmt.NumberGroupSeparator;
    }
    int num = 0;
    bool flag2 = false;
    char* p = str;
    char ch = p[0];
    while (true)
    {
        if ((!IsWhite(ch) || ((options & NumberStyles.AllowLeadingWhite) == NumberStyles.None)) || (((num & 1) != 0) && (((num & 1) == 0) || (((num & 0x20) == 0) && (numfmt.numberNegativePattern != 2)))))
        {
            if ((flag2 = ((options & NumberStyles.AllowLeadingSign) != NumberStyles.None) && ((num & 1) == 0)) && ((chPtr2 = MatchChars(p, numfmt.positiveSign)) != null))
            {
                num |= 1;
                p = chPtr2 - 1;
            }
            else if (flag2 && ((chPtr2 = MatchChars(p, numfmt.negativeSign)) != null))
            {
                num |= 1;
                number.sign = true;
                p = chPtr2 - 1;
            }
            else if (((ch == '(') && ((options & NumberStyles.AllowParentheses) != NumberStyles.None)) && ((num & 1) == 0))
            {
                num |= 3;
                number.sign = true;
            }
            else
            {
                if (((currencySymbol == null) || ((chPtr2 = MatchChars(p, currencySymbol)) == null)) && ((ansiCurrencySymbol == null) || ((chPtr2 = MatchChars(p, ansiCurrencySymbol)) == null)))
                {
                    break;
                }
                num |= 0x20;
                currencySymbol = null;
                ansiCurrencySymbol = null;
                p = chPtr2 - 1;
            }
        }
        ch = *(++p);
    }
    int num2 = 0;
    int index = 0;
    while (true)
    {
        if (((ch >= '0') && (ch <= '9')) || (((options & NumberStyles.AllowHexSpecifier) != NumberStyles.None) && (((ch >= 'a') && (ch <= 'f')) || ((ch >= 'A') && (ch <= 'F')))))
        {
            num |= 4;
            if ((ch != '0') || ((num & 8) != 0))
            {
                if (num2 < 50)
                {
                    number.digits[num2++] = ch;
                    if ((ch != '0') || parseDecimal)
                    {
                        index = num2;
                    }
                }
                if ((num & 0x10) == 0)
                {
                    number.scale++;
                }
                num |= 8;
            }
            else if ((num & 0x10) != 0)
            {
                number.scale--;
            }
        }
        else if ((((options & NumberStyles.AllowDecimalPoint) != NumberStyles.None) && ((num & 0x10) == 0)) && (((chPtr2 = MatchChars(p, currencyDecimalSeparator)) != null) || ((flag && ((num & 0x20) == 0)) && ((chPtr2 = MatchChars(p, numberDecimalSeparator)) != null))))
        {
            num |= 0x10;
            p = chPtr2 - 1;
        }
        else
        {
            if (((((options & NumberStyles.AllowThousands) == NumberStyles.None) || ((num & 4) == 0)) || ((num & 0x10) != 0)) || (((chPtr2 = MatchChars(p, currencyGroupSeparator)) == null) && ((!flag || ((num & 0x20) != 0)) || ((chPtr2 = MatchChars(p, numberGroupSeparator)) == null))))
            {
                break;
            }
            p = chPtr2 - 1;
        }
        ch = *(++p);
    }
    bool flag3 = false;
    number.precision = index;
    number.digits[index] = '\0';
    if ((num & 4) != 0)
    {
        if (((ch == 'E') || (ch == 'e')) && ((options & NumberStyles.AllowExponent) != NumberStyles.None))
        {
            char* chPtr3 = p;
            ch = *(++p);
            chPtr2 = MatchChars(p, numfmt.positiveSign);
            if (chPtr2 != null)
            {
                ch = *(p = chPtr2);
            }
            else
            {
                chPtr2 = MatchChars(p, numfmt.negativeSign);
                if (chPtr2 != null)
                {
                    ch = *(p = chPtr2);
                    flag3 = true;
                }
            }
            if ((ch >= '0') && (ch <= '9'))
            {
                int num4 = 0;
                do
                {
                    num4 = (num4 * 10) + (ch - '0');
                    ch = *(++p);
                    if (num4 > 0x3e8)
                    {
                        num4 = 0x270f;
                        while ((ch >= '0') && (ch <= '9'))
                        {
                            ch = *(++p);
                        }
                    }
                }
                while ((ch >= '0') && (ch <= '9'));
                if (flag3)
                {
                    num4 = -num4;
                }
                number.scale += num4;
            }
            else
            {
                p = chPtr3;
                ch = p[0];
            }
        }
        while (true)
        {
            if (!IsWhite(ch) || ((options & NumberStyles.AllowTrailingWhite) == NumberStyles.None))
            {
                if ((flag2 = ((options & NumberStyles.AllowTrailingSign) != NumberStyles.None) && ((num & 1) == 0)) && ((chPtr2 = MatchChars(p, numfmt.positiveSign)) != null))
                {
                    num |= 1;
                    p = chPtr2 - 1;
                }
                else if (flag2 && ((chPtr2 = MatchChars(p, numfmt.negativeSign)) != null))
                {
                    num |= 1;
                    number.sign = true;
                    p = chPtr2 - 1;
                }
                else if ((ch == ')') && ((num & 2) != 0))
                {
                    num &= -3;
                }
                else
                {
                    if (((currencySymbol == null) || ((chPtr2 = MatchChars(p, currencySymbol)) == null)) && ((ansiCurrencySymbol == null) || ((chPtr2 = MatchChars(p, ansiCurrencySymbol)) == null)))
                    {
                        break;
                    }
                    currencySymbol = null;
                    ansiCurrencySymbol = null;
                    p = chPtr2 - 1;
                }
            }
            ch = *(++p);
        }
        if ((num & 2) == 0)
        {
            if ((num & 8) == 0)
            {
                if (!parseDecimal)
                {
                    number.scale = 0;
                }
                if ((num & 0x10) == 0)
                {
                    number.sign = false;
                }
            }
            str = p;
            return true;
        }
    }
    str = p;
    return false;
}

Bob
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now