SharpInputPlus è una libreria .NET ultra-leggera per applicazioni console, ispirata fedelmente a PyInputPlus di Al Sweigart (porting logico-concettuale in C#, non un fork del codice Python).
Fornisce un modo robusto, puramente logico e non grafico per validare l'input dell'utente da terminale, eliminando la necessità di scrivere continui cicli while(true) e blocchi TryParse manuali.
In C# standard, chiedere un semplice numero intero compreso in un intervallo richiede molto codice ripetitivo (boilerplate).
int eta;
while (true)
{
Console.Write("Inserisci l'età (0-120): ");
if (int.TryParse(Console.ReadLine(), out eta) && eta >= 0 && eta <= 120)
break;
Console.WriteLine("Input non valido. Riprova.");
}using SharpInputPlus;
using static SharpInputPlus.Input;
int eta = InputInt("Inserisci l'età: ", min: 0, max: 120);- API 1:1 con PyInputPlus: stessi nomi di funzione (
InputStr,InputInt,InputFloat,InputBool,InputYesNo,InputChoice,InputMenu,InputEmail,InputNum) e stessi parametri comuni (prompt,defaultValue,blank,limit,timeout,strip,allowRegexes,blockRegexes,applyFunc). - Type-safe: ogni funzione ritorna direttamente il tipo richiesto (
int,double,bool,string), non una stringa da convertire. - Nessuna dipendenza pesante: non altera la grafica del terminale né usa codici ANSI (ideale per log puliti e pipeline di CI/CD).
- Gestione dei tentativi: il parametro
limitlimita il numero di inserimenti errati prima di sollevareRetryLimitException(o restituiredefaultValue, se impostato). - Timeout: il parametro
timeout(in secondi) interrompe l'attesa se l'utente impiega troppo tempo, sollevandoTimeoutException(o restituendodefaultValue, se impostato). - Allow/block list tramite regex:
allowRegexesforza l'accettazione di pattern specifici,blockRegexesrifiuta pattern specifici con un messaggio personalizzabile. - Trasformazioni personalizzate:
applyFuncpermette di normalizzare l'input grezzo prima della validazione.
using SharpInputPlus;
using static SharpInputPlus.Input;
// 1. Validazione di un numero decimale con minimo
double prezzo = InputFloat("Inserisci il prezzo: ", min: 0.99);
// 2. Numero intero compreso in un range, con valore di default dopo troppi tentativi
int eta = InputInt("Inserisci l'età: ", min: 0, max: 120, limit: 3, defaultValue: 18);
// 3. Menu di selezione testuale numerato (ritorna la stringa scelta)
var opzioni = new List<string> { "Pizza", "Pasta", "Insalata" };
string scelta = InputMenu(opzioni, prompt: "Scegli il tuo piatto:", numbered: true);
// 4. Conferma sì/no (ritorna "yes" oppure "no")
string conferma = InputYesNo("Vuoi continuare? ", defaultValue: "yes");
// 5. Gestione avanzata con tentativi massimi (solleva RetryLimitException se non c'è un default)
try
{
int pin = InputInt("Inserisci il PIN di sicurezza: ", limit: 3);
}
catch (RetryLimitException)
{
Console.WriteLine("Troppi tentativi errati!");
}| Funzione | Ritorna | Descrizione |
|---|---|---|
InputStr / InputString |
string |
Accetta una stringa generica. |
InputNum |
double |
Accetta un numero (intero o decimale). |
InputInt |
int |
Accetta un numero intero. Supporta min, max, greaterThan, lessThan. |
InputFloat |
double |
Accetta un numero decimale. Supporta min, max, greaterThan, lessThan. |
InputBool |
bool |
Accetta forme case-insensitive di true/t/false/f. |
InputYesNo |
string |
Accetta forme case-insensitive di yes/y/no/n, ritorna "yes" o "no". |
InputChoice |
string |
Accetta uno dei valori in una lista di scelte. |
InputMenu |
string |
Come InputChoice, ma mostra un menu puntato (*), numerato o lettered. |
InputEmail |
string |
Accetta un indirizzo email sintatticamente valido. |
Tutte le funzioni Input* condividono questi parametri opzionali:
prompt(string): testo mostrato prima di ogni richiesta.defaultValue: valore restituito se si superalimitotimeout, invece di sollevare un'eccezione.blank(bool): setrue, un valore vuoto è accettato come input valido.limit(int?): numero di tentativi concessi prima di arrendersi (RetryLimitExceptionse non c'èdefaultValue).timeout(double?): secondi concessi dal primo prompt (TimeoutExceptionse non c'èdefaultValue).strip(string): caratteri da rimuovere dall'input (default: spazi bianchi tramiteTrim()).allowRegexes(IEnumerable<string>): pattern che, se combaciano, fanno accettare l'input a prescindere da altre regole.blockRegexes(IEnumerable<(string pattern, string message)>): pattern che, se combaciano, fanno rifiutare l'input con un messaggio personalizzato.applyFunc(Func<string, string>): trasformazione applicata all'input grezzo prima della validazione.
RetryLimitException: sollevata quando si superalimitsenza undefaultValue.TimeoutException: sollevata quando si superatimeoutsenza undefaultValue.ValidationException: usata internamente per segnalare un input non valido (il messaggio viene stampato a console e la richiesta ripetuta).
Installa il pacchetto tramite la CLI di .NET:
dotnet add package SharpInputPlus
Oppure tramite il Package Manager Console di Visual Studio:
Install-Package SharpInputPlus
Questo progetto è concesso in licenza sotto i termini della Licenza MIT. Vedi il file LICENSE per i dettagli.
Nota: questo progetto è un porting logico-concettuale di PyInputPlus (sviluppato da Al Sweigart sotto licenza BSD), riscritto da zero in C# — non ne condivide il codice sorgente.