【问题标题】:Base 36 to BigInt?基数 36 到 BigInt?
【发布时间】:2019-09-02 22:16:08
【问题描述】:

假设我想将 base-36 编码的字符串转换为BigInt,我可以这样做:

BigInt(parseInt(x,36))

但是如果我的字符串超出了safely fit in a Number 的范围怎么办?例如

parseInt('zzzzzzzzzzzzz',36)

然后我开始失去精度。

有没有直接解析成BigInt的方法?

【问题讨论】:

  • 在撰写本文时,答案是否定的:BigInt proposal(第 3 阶段草案,2019 年 2 月 11 日)中没有提到任何与 parseInt 等效的内容。提案中提到的字符串的唯一转换是 BigInt() 函数本身,但仅涵盖基数 2、8、10 和 16。

标签: javascript bigint


【解决方案1】:

您可以将数字转换为bigint 类型。

function convert(value, radix) {
    return [...value.toString()]
        .reduce((r, v) => r * BigInt(radix) + BigInt(parseInt(v, radix)), 0n);
}

console.log(convert('zzzzzzzzzzzzz', 36).toString());

使用更大的块,例如使用 10 个(11 个返回错误结果)。

function convert(value, radix) { // value: string
    var size = 10,
        factor = BigInt(radix ** size),
        i = value.length % size || size,
        parts = [value.slice(0, i)];

    while (i < value.length) parts.push(value.slice(i, i += size));

    return parts.reduce((r, v) => r * factor + BigInt(parseInt(v, radix)), 0n);
}

console.log(convert('zzzzzzzzzzzzz', 36).toString());

【讨论】:

  • 非常好。我不知道 parseInt 函数也可以与 radices > 16 一起使用。 radices > 36 怎么办?这是在某处记录的吗? (在 MDN 上没找到...)
  • 别管我的问题。 MDN 声明它接受从 2 到 36 的基数。;)
  • 要获得更大的基数,您需要自定义字符集和自己的函数。
  • 我想知道我们是否可以批量处理 11 个字符? (Number.MAX_SAFE_INTEGER.toString(36).length).. 错误,我猜是 10。
【解决方案2】:

不确定是否有内置的,但是从 base-X 到 BigInt 很容易实现:

function parseBigInt(
  numberString,
  keyspace = "0123456789abcdefghijklmnopqrstuvwxyz",
) {
  let result = 0n;
  const keyspaceLength = BigInt(keyspace.length);
  for (let i = numberString.length - 1; i >= 0; i--) {
    const value = keyspace.indexOf(numberString[i]);
    if (value === -1) throw new Error("invalid string");
    result = result * keyspaceLength + BigInt(value);
  }
  return result;
}

console.log(parseInt("zzzzzzz", 36));
console.log(parseBigInt("zzzzzzz"));
console.log(parseBigInt("zzzzzzzzzzzzzzzzzzzzzzzzzz"));

输出

78364164095
78364164095n
29098125988731506183153025616435306561535n

默认的keyspace 相当于parseInt 使用的base 36,但是如果您需要其他东西,该选项就在那里。 :)

【讨论】:

  • 这个函数不会为任何以0结尾的字符串值产生正确的结果?
猜你喜欢
  • 1970-01-01
  • 2016-01-13
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多