web-dev-qa-db-fra.com

Chaîne binaire en entier

J'ai une chaîne binaire, entrée par l'utilisateur, que je dois convertir en entier.

Au début, j'ai naïvement utilisé cette ligne simple:

Convert.ToInt32("11011",2);

Malheureusement, cela lève une exception si l'utilisateur entre directement l'entier.

Convert.ToInt32("123",2); // throws Exception

Comment puis-je m'assurer que la chaîne saisie par l'utilisateur est bien une chaîne binaire?

  • essayez ... attrapez ... mais c'est trop moche.
  • quelque chose comme "Int32.TryParse" peut-être.

Merci

25
eric

Vous pouvez utiliser un Regex pour vérifier que c'est "^ [01] + $" (ou mieux, "^ [01] {1,32} $"), et alors utiliser Convert?

bien sûr, les exceptions sont peu probables d'être un énorme problème de toute façon! Inélégant? peut être. Mais ça marche.

Exemple (formaté pour un espace vertical):

static readonly Regex binary = new Regex("^[01]{1,32}$", RegexOptions.Compiled);
static void Main() {
    Test("");
    Test("01101");
    Test("123");
    Test("0110101101010110101010101010001010100011010100101010");
}
static void Test(string s) {
    if (binary.IsMatch(s)) {
        Console.WriteLine(Convert.ToInt32(s, 2));
    } else {
        Console.WriteLine("invalid: " + s);
    }
}
29
Marc Gravell

Merci pour la réponse formidable et incroyablement rapide!

Malheureusement, mes exigences ont changé. Maintenant, l'utilisateur peut entrer à peu près n'importe quel format. Binaire, décimal, hexadécimal. J'ai donc décidé try - catch fournit simplement la solution la plus simple et la plus propre.

Donc, juste pour faire bonne mesure, je poste le code que j'utilise maintenant. Je trouve que c'est assez clair et même un peu élégant, ou du moins je pense ^^.

switch (format)
{
    case VariableFormat.Binary:
        try
        {
            result = Convert.ToInt64(value, 2)
        }
        catch
        {
            // error handling
        }
        break;
    case VariableFormat.Decimal:
        try
        {
            result = Convert.ToInt64(value, 10)
        }
        catch
        {
            // error handling
        }
        break;
    case VariableFormat.Hexadecimal:
        try
        {
            result = Convert.ToInt64(value, 16)
        }
        catch
        {
            // error handling
        }
        break;
}

Alors merci de m'avoir encouragé à utiliser try - catch, je pense que cela a vraiment amélioré la lisibilité de mon code.

Merci

4
eric