Как преобразовать число с плавающей запятой в Base36 в C# таким же образом, как это делает JavaScript.toString(36)
Я пытаюсь преобразовать некоторый код в C# (из JavaScript), мне нужно преобразовать двойное число (0.04036483168558814) в ".toString(36)/Base36" на C#.
Код JavaScript здесь:
var num = 0.04036483168558814;
var n = num.toString(36);
Вывод (n) ниже:
0.1gb9f0lx08ij9wwfwkyk5d0a4i
Мне нужен этот же результат выше C#, так как я получу такие же результаты в C#??
Я применил некоторый код, но они не работают.. Мой код ниже (по C#):
1)
string OutputVal = Convert.ToString(Int64.Parse("0.04036483168558814"), 36);
или же
string OutputVal = Convert.ToString(Int64.Parse("0.04036483168558814".Substring(2)), 36);
2)
private const string CharList = "0123456789abcdefghijklmnopqrstuvwxyz";
public static String Encode(long input)
{
if (input < 0) throw new ArgumentOutOfRangeException("input", input, "input cannot be negative");
char[] clistarr = CharList.ToCharArray();
var result = new Stack<char>();
while (input != 0)
{
result.Push(clistarr[input % 36]);
input /= 36;
}
return new string(result.ToArray());
}
string OutputString = Encode(Int64.Parse("0.04036483168558814"));
or
string OutputString = Encode(Int64.Parse("0.04036483168558814".Substring(2)));
4 ответа
Согласно MSDN, вы можете использовать Convert.ToString
метод для того, чтобы преобразовать целое число в строковое представление в базе 2, 8, 10 или 16.
Если вы хотите преобразовать число в базу 36, вы можете использовать существующие сторонние библиотеки:
Проверьте эту статью CodeProject или этот проект GitHub.
Или вы можете написать свой собственный конвертер.
Например, этот класс преобразует целые числа в базу 36:
public static class Base36Converter
{
private const int Base = 36;
private const string Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static string ConvertTo(int value)
{
string result = "";
while (value > 0)
{
result = Chars[value % Base] + result; // use StringBuilder for better performance
value /= Base;
}
return result;
}
}
Обратите внимание, что результат будет в порядке с прямым порядком байтов.
Например, десятичный 1296
будет 100
в базе-36.
Я написал код, чтобы получить этот результат.
Вот код:
// ==========================================
string Results = Encode(0.04036483168558814);
// ==========================================
private string Encode(double input)
{
var result = new Stack<char>();
char[] clistarr = "0123456789abcdefghijklmnopqrstuvwxyz".ToCharArray();
Int64 inputValInt = 0;
string inputValP = "";
double inputValN = 0;
string ReturnsVal = "";
if (input.ToString() != "")
{
try
{
if (input.ToString().Contains("."))
{
inputValP = input.ToString().Substring(0, input.ToString().IndexOf("."));
inputValInt = Int64.Parse(inputValP);
if (inputValInt != 0)
{
while (inputValInt != 0)
{
result.Push(clistarr[inputValInt % 36]);
inputValInt /= 36;
}
char[] RevArr1 = result.ToArray();
Array.Reverse(RevArr1);
result = new Stack<char>();
for (int i = (RevArr1.Length - 1); i >= 0; i--)
{
result.Push(RevArr1[i]);
}
result.Push('.');
}
else
{
result.Push('0');
result.Push('.');
}
inputValN = input - inputValInt;
double inputVal = inputValN;
int CountLoop = 0;
while (CountLoop < 11)
{
double tempVal = (inputVal * 36);
int Start = tempVal.ToString("R").IndexOf(".");
if (Start > 0)
{
inputValP = tempVal.ToString("R").Substring(0, Start);
int TopVal = Int16.Parse(inputValP);
result.Push(clistarr[TopVal]);
inputVal = tempVal - TopVal;
}
CountLoop++;
}
char[] RevArr = result.ToArray();
Array.Reverse(RevArr);
ReturnsVal = new string(RevArr);
}
else
{
inputValInt = Convert.ToInt64(input);
while (inputValInt != 0)
{
result.Push(clistarr[inputValInt % 36]);
inputValInt /= 36;
}
char[] RevArr = result.ToArray();
ReturnsVal = new string(RevArr);
}
}
catch (Exception ee)
{
return ("");
}
}
else
{
return ("");
}
return (ReturnsVal);
}
Вот рекурсивная функция:
using System;
class Program {
static string encode(int nIn, int nBase) {
int n = nIn / nBase;
char c = "0123456789abcdefghijklmnopqrstuvwxyz"[nIn % nBase];
return n > 0 ? encode(n, nBase) + c : c.ToString();
}
static void Main() {
var n = 1577858399;
var s = encode(n, 36);
Console.WriteLine(s == "q3ezbz");
}
}
Благодаря ответу user2032344 мне наконец удалось получить тот же результат, что и Javascript.
Math.random().toString(36)
в С++/Qt
static QString JSMathRandomToString36(double input)
{
static const auto clistarr = QByteArray("0123456789abcdefghijklmnopqrstuvwxyz");
QString result;
for(auto i = 0; i < 11 ; i++){
auto tempVal = (input * 36);
auto tempValStr = QString::number(tempVal, 'R');
auto decIndex = tempValStr.indexOf(".");
if (decIndex > 0) {
auto topVal = tempValStr.mid(0, decIndex).toShort();
result.append(clistarr[topVal]);
input = tempVal - topVal;
}
}
return (result);
}