【问题标题】:JavaScript - Preventing octal conversionJavaScript - 防止八进制转换
【发布时间】:2016-03-27 10:40:00
【问题描述】:

我将数字输入作为参数,只是试图解释前导零。但似乎 javascript 在我可以对数字做任何事情之前将数字转换为八进制。到目前为止,解决它的唯一方法是,如果我最初将数字作为字符串传递,但我希望在传递之后有另一种方法来转换它?到目前为止尝试过(使用017 提醒我注意八进制行为):

017.toString(10) // 15
parseInt(017,10) // 15
017 + "" //15
new Number(017) //15

new Number('017') //17
parseInt('017', 10) // 17

给定

function(numb) {

if (typeof numb === number) {
// remove leading zeroes and convert to decimal
}
else {
 // use parseInt
}

}

'use strict' 似乎也没有像一些较早的帖子所建议的那样解决这个问题。有什么想法吗?

【问题讨论】:

  • 你如何输入一个数字并让它以字符串形式出现......?! Number 不能有“前导零”。

标签: javascript regex numbers octal


【解决方案1】:
  1. 如果你采用“数字输入”,你应该始终保证有一个字符串。在这种情况下,我知道没有返回Number 的输入法。由于您收到一个字符串,parseInt(.., 10) 总是足够的。 017 仅在源代码中按字面意思写成八进制时才被解释为八进制(或者当缺少 parseInt 的 radix 参数时)。
  2. 如果出于某种奇怪的原因,您最终将十进制解释为八进制,并且您想将该值反向转换回十进制,这非常简单:用八进制表示该值并将其重新解释为十进制:

    var oct = 017; // 15
    parseInt(oct.toString(8), 10) // 17
    

    虽然您可能不知道输入最初是否被解释为八进制,但这不是您应该做的事情。

【讨论】:

  • 抱歉,我所说的“数字输入”是指我向函数传递了一个像 017 这样的数字,而不是“017”。这有点出于兴趣而不是要求,因为我正在考虑发送(可能是偶然的)有一些前导零的数字。您的第二个答案也确实有很大帮助,我没想过这样做。感谢您的回答!
  • 如果您在源代码中将017 作为函数的参数写入,那么您正在写入 15。只是符号不同。数字没有前导零。写你的意思,不要让你的代码适应你没有真正意思的东西。
【解决方案2】:

JavaScript 解释所有以 0 开头的数字,并将所有八进制数字包含为八进制 - 例如,017 将是八进制,但 019 不会。如果您希望您的数字为小数,那么
1.省略前导0。
2. 继续使用 parseInt()。

原因是 JavaScript 使用了一些隐式转换,它会根据数字选择最可能的情况。在 JavaScript 中,前导 0 是数字是八进制的信号。如果您需要前导 0,那么您必须接受该规则并使用 parseInt()。

Source

【讨论】:

    【解决方案3】:

    如果您在脚本中手动键入数字,则不要使用前导零(如果数字是有效的八进制,则隐含地将数字视为八进制 - 如果不是,则将其视为十进制)。如果您将数字作为字符串,则只需使用 + 运算符转换为(十进制)数字。

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

    严格模式不允许使用零前缀

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

    【讨论】:

      【解决方案4】:

      我会添加一个数字 8 及以上

      num = "017"+8 
      new Number((Number (num)-8)/10)
      

      【讨论】:

      • 请在您的答案中添加一些解释,以便其他人可以从中学习
      • 这是做什么的?它与Number("017") 的作用相同。
      猜你喜欢
      • 2020-06-19
      • 1970-01-01
      • 2020-12-15
      • 2015-07-26
      • 2012-10-20
      • 1970-01-01
      • 2015-09-06
      • 2013-10-22
      • 1970-01-01
      相关资源
      最近更新 更多