4

我正在尝试将一些代码转换为 C#(来自 JavaScript),我需要通过 C# 将双数(0.04036483168558814)转换为“.toString(36)/Base36”。

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

4 回答 4

3

根据MSDN,您可以使用Convert.ToString方法将整数转换为以 2、8、10或 16 为底的字符串表示形式。

如果要将数字转换为基数 36,则可以使用现有的第三方库:

查看此 CodeProject 文章或此GitHub 项目

或者您可以编写自己的转换器。
例如,此类将整数转换为 Base 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将采用100base-36。

于 2015-11-16T06:28:11.970 回答
2

我写了一些代码来得到这个结果。

这是代码:

//===========================================

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);
        }
于 2016-01-14T04:35:12.077 回答
0

这是一个递归函数:

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");
   }
}
于 2020-11-03T02:29:31.137 回答
0

感谢 user2032344 的回答,我终于设法Math.random().toString(36)在 C++/Qt 中获得与 Javascript 相同的结果

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);
}
于 2022-02-25T22:24:01.967 回答