How to write two Readline in a single line?

Asked

Viewed 76 times

0

I was doing some tests and when I tried to do an example of date system, in the case of birth I came across the problem, that Voce can only write at the end of the Console.Write(), when Voce puts a Console.Readline(), Voce can write and define that variable. But you can only do this once, how can I use this 3 times with 3 variables in only one line? In case I wanted to put the day behind the first bar of birth and the month on Monday.

Script:

using System;

class Program
{
    static void Main()
    {
        string nome;
        string profissao;
        int idade;
        int dia, mes, ano;

        Console.Write("Nome: "); nome = Console.ReadLine();
        Console.Write("idade: "); idade = int.Parse(Console.ReadLine());
        Console.Write("Nascimento: / /"); ano = int.Parse(Console.ReadLine());
        Console.Write("Profissão: "); profissao = Console.ReadLine();    
    }
}

Thank you in advance!

  • You can use Console.Setcursorposition (x, y)

  • How could I include this in my script? Because from what I saw it only changes the position of the string;

  • Wouldn’t that be what you’re looking for, ano = DateTime.Parse(Console.ReadLine()); .Class documentation DateTime.

1 answer

1


Using the function Console.SetCursorPosition you change the position that the cursor, along with this, you can use the function Console.ReadKey() to read only one character.

Based on this, I created a small example of how you could accomplish such a question. Behold:

static bool ChecarTamanhoString(string variable, int size)
{
    return string.IsNullOrWhiteSpace(variable) || variable?.Trim().Length < size;
}

static string LerCampoData(string mensagem)
{
    string dia = "", mes = "", ano = "";

    Console.Write($"{mensagem}:  /  /    ");
    bool valido;
    do
    {
        //Calcula a posição do cursor
        //baseado no que já foi informado pelo usuário
        //Exemplo: (Tamanho da mensagem) + (dias, se houver algo) + (mes, se houver dias informado) + (ano, se houver dias e mês informado)
        int cursorLeftPosition = (mensagem.Length + 1) +
                (dia != null ? dia.Length : 0) +
                (dia?.Length == 2 ? 1 + mes.Length : 0) +
                (mes?.Length == 2 && dia?.Length == 2 ? ano.Length + 1 : 0);

        //Posiciona o cursor conforme o que foi calculado
        Console.SetCursorPosition(cursorLeftPosition, Console.CursorTop);
                
        //Lê apenas uma letra do console
        var key = Console.ReadKey().KeyChar;
                                
        if (ChecarTamanhoString(dia, 2))
            dia += key;
        else if (ChecarTamanhoString(mes, 2))
            mes += key;
        else if (ChecarTamanhoString(ano, 4))
            ano += key;

        //Caso todas as variaveis estiverem informadas, está valido
        valido = (dia.Length + mes.Length + ano.Length) == 8;
    }
    while (!valido);

    Console.SetCursorPosition(0, Console.CursorTop + 1);
    return $"{dia}/{mes}/{ano}";
}

static void Main(string[] args)
{
    Console.WriteLine("Início");
    bool dataNascimentoValida;
    do
    {
        string inputDate = LerCampoData("Data de nascimento");
        dataNascimentoValida = DateTime.TryParse(inputDate, out DateTime dataNascimento);
        if (!dataNascimentoValida)
        {
            Console.WriteLine("Data inválida");
        }
    }
    while (!dataNascimentoValida);

    Console.WriteLine("Fim");
    Console.ReadKey();
}
  • 1

    Thank you very much! It worked perfectly!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.