Сделайте это двухэтапным процессом: парсинг строки одного из трех форматов, а затем преобразование в один из трех форматов.
Для анализа вы можете использовать соответствующий 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);
}
}