【问题标题】:Javascript, why treated as octalJavascript,为什么被视为八进制
【发布时间】:2019-05-02 19:56:41
【问题描述】:

我将一个 id 作为参数传递给一个 javascript 函数,因为它来自 UI,它被填充为零。但它似乎有(也许)“奇怪”的行为?

    console.log(0000020948);  //20948
    console.log(0000022115);   //9293 which is 22115's octal 
    console.log(parseInt(0000022115, 10));  // 9293 which is 22115's octal
    console.log(0000033959);  //33959
    console.log(20948);  //20948
    console.log(22115); //22115
    console.log(33959); //33959

我如何确保它们解析为正确的数字? (十进制)

编辑:

只是让它更清楚:

这些数字来自服务器并且是零填充字符串。我正在为每个人制作一个删除按钮。

喜欢:

function printDelButton(value){
          console.log(typeof value);  //output string 
  return '<a href="#" onclick="deleteme('+value+')"><img src="images/del.png"></a>'
}

and 

function printDelButton(value){
console.log(typeof value); //output numeric
    console.log(value);   //here output as octal .... :S
 }

我试过了:

console.log(parseInt(0000022115, 10));  // 9293 which is 22115's octal

仍然解析为八进制

【问题讨论】:

  • 不要使用零填充数字,而是使用空格。
  • 为什么UI左边用0填充?
  • 在脚本中使用"use strict" 指令可能是个好主意。这将导致任何使用八进制文字都会引发错误,并且应该使调试变得更容易!
  • 关于parseInt(0000022115, 10):您仍然传递一个数字作为第一个参数,这使得JavaScript 首先转换数字,然后将其传递给parseInt。而是传递一个字符串。
  • 如果您从'&lt;a...&lt;/a&gt;' 字符串创建一个新元素,那么您需要将字符串的value 部分用引号括起来。 '&lt;a href="#" onclick="deleteme(\''+value+'\')"&gt;'

标签: javascript


【解决方案1】:

如果您将参数作为字符串对象接收,则应该可以使用

 parseInt(string, 10)

将字符串解释为十进制,即使它们以 0 开头。

在您的测试中,您向 parseInt 方法传递了一个数字,而不是一个字符串,也许这就是它没有返回预期结果的原因。

试试

 parseInt('0000022115', 10)

而不是

parseInt(0000022115, 10)

这确实为我返回 221115。

【讨论】:

    【解决方案2】:

    如果您以 0 开头,则将其解释为八进制数。

    http://www.hunlock.com/blogs/The_Complete_Javascript_Number_Reference#quickIDX2

    请注意此处的文章警告:

    除非你是 专门寻找八进制转换!

    考虑在这里寻找有关删除前导 0 的想法: Truncate leading zeros of a string in Javascript

    【讨论】:

    • 我更新了问题。它们是来自服务器的零填充字符串。
    • @Kossel - 所以从 JavaScript 中的字符串中删除零。
    【解决方案3】:

    前导0s 表示该数字是八进制数。

    parseInt 解析包含数字的字符串。
    parseInt(0000022115, 10) 传递数字文字。 JS 解释器以八进制解析文字,因此您将原始数值传递给parseInt

    【讨论】:

      【解决方案4】:

      除非你能截获这个数字的字符串版本,否则你就不走运了。

      话虽如此,如果您可以获得八进制的字符串版本(调用 toString() 将无济于事),这将起作用:

      parseInt(variable_string.replace(/^0+/, ''), 10);
      

      【讨论】:

        【解决方案5】:

        试试

        /^[0]*([1-9]\d)/.exec(numberFromUI)[0]
        

        这应该只给你去除零的数字(如果你必须支持小数,你需要编辑以解释'.',当然','也很有趣......我真的希望您不必处理欧洲人写数字的所有疯狂的不同方式!)

        【讨论】:

        • 否;只需使用parseInt(str, 10)parseFloat。问题是他有一个字面量。
        【解决方案6】:

        如果数字作为零填充字符串来自服务器,则使用+"0000022115"

        console.log(+"0000022115")
        
        if (021 < 019) console.log('Paradox');

        JS 仅当它们是有效的八进制时才将零填充数字视为八进制 - 如果不是,则将其视为十进制。不允许悖论'use strict'模式

        'use strict'
        
        if (021 < 019) console.log('Paradox');

        【讨论】:

          猜你喜欢
          • 2016-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-23
          相关资源
          最近更新 更多