snippetcsharpMinor
Convert number from base-10 number system to any number system
Viewed 0 times
numberconvertsystemanyfrombase
Problem
I wrote a small method for convert number from base-10 number system to any number system (code is not perfect but that is not the point).
My question is if I get right single responsibility principle. Is 2nd approach better than 1st or 'charReplace' functionality is too small for creating own method ?
vs.
My question is if I get right single responsibility principle. Is 2nd approach better than 1st or 'charReplace' functionality is too small for creating own method ?
public static string convertNumber(BigInteger num, int baseNum)
{
string symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
if (baseNum = 10)
{
result = result.Insert(0, symbols[partResult - 10].ToString());
}
else
{
result = result.Insert(0, partResult.ToString());
}
num /= baseNum;
} while (num != 0);
return result;
}vs.
static readonly string Symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
public static string convertNumber(BigInteger num, int baseNum)
{
if (baseNum < 2 || Symbols.Length + 10 < baseNum)
{
throw new Exception;
}
var result = "";
do
{
var partResult = (int)(num % baseNum);
result = result.Insert(0, charReplace(partResult));
num /= baseNum;
} while (num != 0);
return result;
}
private static string charReplace(int number){
if (number < 10){
return number.ToString();
}
return Symbols[number - 10].ToString();
}Solution
I believe the 1st approach is good enough since it personally more readable.
Little suggestions
Summarizing:
PS. It's recommended to name all classes and all methods in UpperCamelCase regardless of their publicity.
Little suggestions
- I'd prefer to store the whole alphabet in the
symbolsstring, instead of only letters. This could simplify the logic.
- You can calculate the resulting length of the output string and avoid string insertions.
Summarizing:
public static string ConvertNumber(BigInteger num, int baseNum)
{
const string symbols = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
if (baseNum < 2 || symbols.Length < baseNum)
{
throw new ArgumentOutOfRangeException(nameof(baseNum));
}
if (num < 0)
{
throw new ArgumentOutOfRangeException(nameof(num));
}
var resultLength = 1 + Math.Max((int)BigInteger.Log(num, baseNum), 0);
var result = new char[resultLength];
int index = resultLength - 1;
do
{
result[index--] = symbols[(int)(num % baseNum)];
num /= baseNum;
} while (num != 0);
return new string(result);
}PS. It's recommended to name all classes and all methods in UpperCamelCase regardless of their publicity.
Code Snippets
public static string ConvertNumber(BigInteger num, int baseNum)
{
const string symbols = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
if (baseNum < 2 || symbols.Length < baseNum)
{
throw new ArgumentOutOfRangeException(nameof(baseNum));
}
if (num < 0)
{
throw new ArgumentOutOfRangeException(nameof(num));
}
var resultLength = 1 + Math.Max((int)BigInteger.Log(num, baseNum), 0);
var result = new char[resultLength];
int index = resultLength - 1;
do
{
result[index--] = symbols[(int)(num % baseNum)];
num /= baseNum;
} while (num != 0);
return new string(result);
}Context
StackExchange Code Review Q#157512, answer score: 2
Revisions (0)
No revisions yet.