Miguel Coder
Miguel Coder

Reputation: 1949

How to convert user input to an int Array in c#

The closest thing I found to answering this question was converting several string inputs into an array using a for loop.

I just want to take 1 string and convert the first 7 digits into an int array.

This code takes integer values of characters and then tests them against the Unicode values to return true if it is valid or false to reiterate the while loop and ask for input again. When I do this with the Console.Read(); method, and put in an invalid value first, it will say that my code is invalid for 7 more iterations. That means console.Read() has to run 7 more times even if the string has valid input.

public static void GetDigits(ref int[] callNumberArray, ref bool valid)
        {
        Console.WriteLine("Please enter the code you wish to dial.");
        while ( valid == false)
        {//This loop will reiterate the read() function if the code is not valid.
            valid = true;
            for (int i = 0; i < 7; i++ )
            {
                if (i != 6 && i!= 5 && i != 5 && i != 4 && i != 3 && i != 2 && i != 1 && i != 0)
                {
                    i = 0;
                }
                callNumberArray[i] = Console.Read();// I want to change this

            }
            for (int i = 0; i < 7; i++)
            {
                if (i != 6 && i != 5 && i != 5 && i != 4 && i != 3 && i != 2 && i != 1 && i != 0)
                {
                    i = 0;
                }
                if (callNumberArray[0] == 53)
                {
                    valid = false;
                }
                if (callNumberArray[i] < 49)
                {
                    valid = false;
                }
                if (callNumberArray[i] > 57 && callNumberArray[i] < 65)
                {
                    valid = false;
                }
                if (callNumberArray[i] > 90 && callNumberArray[i] < 97)
                {
                    valid = false;
                }
                if (callNumberArray[i] > 122)
                {
                    valid = false;
                }
            }
            if (valid == false)
            {
                Console.WriteLine("You entered an invalid code. Please re-enter your code.");
            }

        }

Upvotes: 1

Views: 1659

Answers (5)

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236328

Here is method which prompts user to input phone number, denies invalid characters and shows current phone number with placeholder for numbers left to input:

private static int[] GetPhoneNumber(int phoneLength = 7)
{
    List<int> phoneNumbers = new List<int>();

    while (true)
    {
        EditorFor("Phone", String.Concat(phoneNumbers), phoneLength);

        var key = Console.ReadKey(intercept: true);
        if (key.Key == ConsoleKey.Escape) 
            return new int[0]; // return empty array if user cancelled input

        var c = key.KeyChar;
        if (!Char.IsDigit(c))
            continue;

        phoneNumbers.Add(Int32.Parse(c.ToString()));
        if (phoneNumbers.Count == phoneLength)
        {
            EditorFor("Phone", String.Concat(phoneNumbers), phoneLength);
            return phoneNumbers.ToArray();
        }
    }
}

Prompt for input:

private static void EditorFor(string label, string value, int length)
{
    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write(new String(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, Console.CursorTop);

    int charactersLeftToInput = length - value.Length;
    string placeholder = new String('*', charactersLeftToInput);

    Console.Write("{0}: {1}{2}", label, value, placeholder);
    Console.CursorLeft -= charactersLeftToInput;
}

Usage:

Console.WriteLine("Please enter the code you wish to dial.");
int[] code = GetPhoneNumber(); // if you want default length

Console:

enter image description here

Upvotes: 1

Nguyen Le Hoang
Nguyen Le Hoang

Reputation: 37

I think you should use Regex, example:

MatchCollection matchList = Regex.Matches(Content, Pattern);
var list = matchList.Cast<Match>().Select(match => match.Value).ToList();

Upvotes: 3

Miguel Coder
Miguel Coder

Reputation: 1949

Okay so After much deliberation I decided to use a separate Console.Read(); for each element in the array and now it's doing what I want it to do.

while ( valid == false)
        {
            valid = true;
            callNumberArray[0] = Console.Read();
            callNumberArray[1] = Console.Read();
            callNumberArray[2] = Console.Read();
            callNumberArray[3] = Console.Read();
            callNumberArray[4] = Console.Read();
            callNumberArray[5] = Console.Read();
            callNumberArray[6] = Console.Read();
//etc etc...

Upvotes: 0

Maximilian Gerhardt
Maximilian Gerhardt

Reputation: 5353

I just want to take 1 string and convert the first 7 digits into an int array.

string subString = Console.ReadLine().Substring(0,7);
//Check if the whole string is a parsable number
if(int.TryParse(subString) == false) 
{
      Console.WriteLine("Not a valid number..."); 
      return;
} 
//convert it an int[]
int[] values = subString.ToCharArray().Select( value => int.Parse(value.ToString())).ToArray();

That's it basically, if you want to do it character by character that's fine, too, but's it's far easier to check for a number using int.TryParse() or a regex [0-9] (per character) if you're confortable with that.

Upvotes: 2

Felix Av
Felix Av

Reputation: 1254

Not sure about the "algorithm" you wrote and I agree with Sergey Berezovskiy that the if's looks weird, anyway this should answer your specific question:

public static void GetDigits(ref int[] callNumberArray, ref bool valid)
    {
    Console.WriteLine("Please enter the code you wish to dial.");
    while ( valid == false)
    {//This loop will reiterate the read() function if the code is not valid.
        valid = true;
        for (int i = 0; i < 7; i++ )
        {
            if (i != 6 && i!= 5 && i != 5 && i != 4 && i != 3 && i != 2 && i != 1 && i != 0)
            {
                i = 0;
            }
            callNumberArray[i] = Console.Read();// I want to change this

        }
        for (int i = 0; i < 7; i++)
        {
            if(!valid) break;
            if (i != 6 && i != 5 && i != 5 && i != 4 && i != 3 && i != 2 && i != 1 && i != 0)
            {
                i = 0;
            }
            if (callNumberArray[0] == 53)
            {
                valid = false;
            }
            if (callNumberArray[i] < 49)
            {
                valid = false;
            }
            if (callNumberArray[i] > 57 && callNumberArray[i] < 65)
            {
                valid = false;
            }
            if (callNumberArray[i] > 90 && callNumberArray[i] < 97)
            {
                valid = false;
            }
            if (callNumberArray[i] > 122)
            {
                valid = false;
            }
        }
        if (valid == false)
        {
            Console.WriteLine("You entered an invalid code. Please re-enter your code.");
        }

    }

Upvotes: 1

Related Questions