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();
}
You can use Console.Setcursorposition (x, y)
– Natan Fernandes
How could I include this in my script? Because from what I saw it only changes the position of the string;
– Poke Clash
Wouldn’t that be what you’re looking for,
ano = DateTime.Parse(Console.ReadLine());
.Class documentationDateTime
.– Augusto Vasques