如何以与JavaScript'相同的方式将C中的浮点数转换为Base36;s.toString(36)做到了
我正在尝试将一些代码转换为C#(来自JavaScript),我需要将一个双倍数字(0.0403648483168558814)转换为C#的“.toString(36)/Base36” JavaScript代码如下:如何以与JavaScript'相同的方式将C中的浮点数转换为Base36;s.toString(36)做到了,javascript,c#,encoding,base36,Javascript,C#,Encoding,Base36,我正在尝试将一些代码转换为C#(来自JavaScript),我需要将一个双倍数字(0.0403648483168558814)转换为C#的“.toString(36)/Base36” JavaScript代码如下: var num = 0.04036483168558814; var n = num.toString(36); 输出(n)如下: 我需要用C#得到上述相同的结果,那么如何用C#得到相同的结果呢 我应用了一些代码,但它们不起作用。。 下面是我的代码(由C#编写): (一) 或
var num = 0.04036483168558814;
var n = num.toString(36);
输出(n)如下:
我需要用C#得到上述相同的结果,那么如何用C#得到相同的结果呢
我应用了一些代码,但它们不起作用。。
下面是我的代码(由C#编写):
(一)
或
(二)
private const string CharList=“0123456789abcdefghijklmnopqrstuvwxyz”;
公共静态字符串编码(长输入)
{
如果(输入<0)抛出新ArgumentOutOfRangeException(“输入”,输入,“输入不能为负”);
char[]clistarr=CharList.ToCharArray();
var result=新堆栈();
while(输入!=0)
{
结果.推送(clistarr[输入%36]);
输入/=36;
}
返回新字符串(result.ToArray());
}
string OutputString=Encode(Int64.Parse(“0.040364483168558814”);
或
string OutputString=Encode(Int64.Parse(“0.040364483168558814.Substring(2));
根据,您可以使用Convert.ToString
方法将整数转换为以2、8、10或16为基数的字符串表示形式
如果要将数字转换为基数36,可以使用现有的第三方库:
看看这个
或者您可以编写自己的转换器。例如,此类将整数转换为基数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;
}
}
请注意,结果将按大端顺序排列。例如,在base-36中,十进制
1296
将是100
。我编写了一些代码来获得这个结果
代码如下:
//==========================================
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);
}
//==========================================
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);
}
私有字符串编码(双输入)
{
var result=新堆栈();
char[]clistarr=“0123456789abcdefghijklmnopqrstuvxyz”。ToCharArray();
Int64 inputValInt=0;
字符串inputValP=“”;
双输入值n=0;
字符串ReturnsVal=“”;
if(input.ToString()!=“”)
{
尝试
{
if(input.ToString()包含(“.”)
{
inputValP=input.ToString().Substring(0,input.ToString().IndexOf(“.”);
inputValInt=Int64.Parse(inputValP);
如果(输入有效!=0)
{
while(输入有效!=0)
{
结果.推送(clistarr[inputValInt%36]);
输入有效/=36;
}
char[]RevArr1=result.ToArray();
数组。反向(RevArr1);
结果=新堆栈();
对于(int i=(RevArr1.Length-1);i>=0;i--)
{
结果推送(RevArr1[i]);
}
结果.推('.');
}
其他的
{
结果推送('0');
结果.推('.');
}
inputValN=输入-输入有效;
双输入值=输入值n;
int CountLoop=0;
while(CountLoop<11)
{
双tempVal=(inputVal*36);
int Start=tempVal.ToString(“R”).IndexOf(“.”);
如果(开始>0)
{
inputValP=tempVal.ToString(“R”).子字符串(0,开始);
inttopval=Int16.Parse(inputValP);
结果推送(clistarr[TopVal]);
inputVal=tempVal-TopVal;
}
CountLoop++;
}
char[]RevArr=result.ToArray();
数组。反向(RevArr);
ReturnsVal=新字符串(RevArr);
}
其他的
{
inputValInt=Convert.ToInt64(输入);
while(输入有效!=0)
{
结果.推送(clistarr[inputValInt%36]);
输入有效/=36;
}
char[]RevArr=result.ToArray();
ReturnsVal=新字符串(RevArr);
}
}
捕获(异常ee)
{
返回(“”);
}
}
其他的
{
返回(“”);
}
返回(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");
}
}
请注意:此示例无法正常工作。由于行
result+=Chars[value%36],结果字符串与它应该的相反代码>是向后的,实际上应该是result=Chars[value%36]+result代码>@Nick谢谢你的更正。我已更改此代码以使结果为big-endian:)
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");
}
}