Как преобразовать число с плавающей запятой в 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);
}
Другие вопросы по тегам