Convert.ToString
può essere utilizzato per convertire un numero nella sua rappresentazione di stringa equivalente in una base specificata.
Esempio:
string binary = Convert.ToString(5, 2); // convert 5 to its binary representation
Console.WriteLine(binary); // prints 101
Tuttavia, come sottolineato dai commenti, Convert.ToString
supporta solo il seguente insieme di basi limitato, ma generalmente sufficiente: 2, 8, 10 o 16.
Aggiorna (per soddisfare il requisito per la conversione in qualsiasi base):
Non sono a conoscenza di alcun metodo nel BCL che sia in grado di convertire i numeri in qualsiasi base, quindi dovresti scrivere la tua piccola funzione di utilità. Un semplice esempio sarebbe simile a questo (si noti che questo sicuramente può essere reso più veloce sostituendo la concatenazione di stringhe):
class Program
{
static void Main(string[] args)
{
// convert to binary
string binary = IntToString(42, new char[] { '0', '1' });
// convert to hexadecimal
string hex = IntToString(42,
new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'});
// convert to hexavigesimal (base 26, A-Z)
string hexavigesimal = IntToString(42,
Enumerable.Range('A', 26).Select(x => (char)x).ToArray());
// convert to sexagesimal
string xx = IntToString(42,
new char[] { '0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x'});
}
public static string IntToString(int value, char[] baseChars)
{
string result = string.Empty;
int targetBase = baseChars.Length;
do
{
result = baseChars[value % targetBase] + result;
value = value / targetBase;
}
while (value > 0);
return result;
}
/// <summary>
/// An optimized method using an array as buffer instead of
/// string concatenation. This is faster for return values having
/// a length > 1.
/// </summary>
public static string IntToStringFast(int value, char[] baseChars)
{
// 32 is the worst cast buffer size for base 2 and int.MaxValue
int i = 32;
char[] buffer = new char[i];
int targetBase= baseChars.Length;
do
{
buffer[--i] = baseChars[value % targetBase];
value = value / targetBase;
}
while (value > 0);
char[] result = new char[32 - i];
Array.Copy(buffer, i, result, 0, 32 - i);
return new string(result);
}
}
Aggiornamento 2 (miglioramento delle prestazioni)
L'utilizzo di un buffer di array invece della concatenazione di stringhe per creare la stringa del risultato offre un miglioramento delle prestazioni soprattutto su un numero elevato (vedere il metodo IntToStringFast
). Nel migliore dei casi (cioè il più lungo possibile input) questo metodo è circa tre volte più veloce. Tuttavia, per i numeri a 1 cifra (cioè 1 cifra nella base target), IntToString
sarà più veloce.