Целочисленный-двоичный-гекса-конвертер в C # - PullRequest
0 голосов
/ 05 февраля 2012

Я кодирую конвертер в C # для преобразования из целого, двоичного и шестнадцатеричного в те же форматы.Конечно, формат ввода и выходной формат дается.Другим интересным моментом является то, что мой ввод string, а вывод string.

Итак, теперь мне интересно, есть ли способ сделать все эти преобразования, используя одну и ту же функцию, потому что во всех исследованных мной вопросах некоторые решения даются только для одного из моих 6 случаев, и я не нахожу его на самом делеэлегантный.

Подводя итог:

Input String | Output String
-------------|--------------
int32        | hexa
int32        | binary
binary       | int32
binary       | hexa
hexa         | int32
hexa         | binary

РЕДАКТИРОВАТЬ: Все исключения будут обрабатываться с помощью try-catch при необходимости.

1 Ответ

1 голос
/ 05 февраля 2012

Сделайте это двухэтапным процессом: парсинг строки одного из трех форматов, а затем преобразование в один из трех форматов.

Для анализа вы можете использовать соответствующий Parse (илиTryParse если вы хотите избежать исключений) методы, которые существуют для различных числовых типов.На целочисленных типах вы можете использовать NumberStyles.HexNumber для анализа шестнадцатеричного числа.

Чтобы преобразовать в строку, используйте перегруженную ToString с соответствующей культурой и форматом.

Обратите внимание, что вы можете выполнять преобразования типов через интерфейс IConvertible, который поддерживается всемитипы собственных чисел.

Вот некоторый псевдокод ( не скомпилирует , но должен проиллюстрировать сделанные замечания):

enum NumberKind {
  Int32,
  Decimal,
  Hexa
}

string ConvertNumber(NumberKind inputKind, string inputValue, NumberKind outputKind) {
  IConvertible intermediate;
  switch (inputKind) {
  case NumberKind.Int32:
    intermediate = Int32.Parse(inputValue, NumberStyles.Integer, CultureInfo.InvariantCulture);
    break;
  case NumberKind.Decimal:
    intermediate = Decimal.Parse(inputValue, NumberStyles.Number, CultureInfo.InvariantCulture);
    break;
  case NumberKind.Hexa:
    intermediate = Int32.Parse(inputValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
    break;
  }
  switch (outputKind) {
  case NumberKind.Int32:
    return intermediate.ToInt32().ToString("D", CultureInfo.InvariantCulture);
  case NumberKind.Decimal:
    return intermediate.ToDecimal().ToString("G", CultureInfo.InvariantCulture);
  case NumberKind.Hexa:
    return intermediate.ToInt32().ToString("X", CultureInfo.InvariantCulture);
  }
}
...