JavaScript 检测不同场景下的八进制值
JavaScript Detecting Octal Value at Different Scenario
var x = 02345;
var y = x.toString();
alert(y);
我意识到在 JavaScript 中使用 toString() 方法将前导零数字转换为字符串时出现问题。
从上面代码的输出可以看出,输出是1253
而不是所谓的02345
.
如果删除前导零,代码将按预期运行,为什么?上面的代码发生了什么,所以我可以将其更改为按预期工作。
var x = 2345;
var y = x.toString();
alert(y);
编辑:我问这个问题的原因是因为我有两个不同的代码,尽管非常相似,但它们的工作方式不同。看完这个问题与toString()方法无关,为什么下面的第一组代码没有将数字检测为八进制值,而第二组代码却检测到了。
var num=window.prompt(); // num = 0012222
var str = num.toString();
var result = [str[0]];
for(var x=1; x<str.length; x++)
{
if((str[x-1]%2 === 0)&&(str[x]%2 === 0))
{
result.push('-', str[x]);
}
else
{
result.push(str[x]);
}
}
alert(result.join('')); //Outputs : 0-012-2-2-2
其他代码:
function numberDash(num) {
var stringNumber = num.toString();
var output = [stringNumber[0]];
for (var i = 1; i < stringNumber.length; i++) {
if (stringNumber[i-1] % 2 === 0 && stringNumber[i] % 2 === 0) {
output.push('-', stringNumber[i]);
} else {
output.push(stringNumber[i]);
}
}
return output.join('');
}
numberDash(0012222) // Outputs : "52-6-6";
许多 JavaScript 引擎在规范中添加了八进制数字文字。前导零表示八进制(基数 8)。 2345
以 8 为基数(八进制)是 1253
以 10 为基数(十进制):
Octal Decimal
----- --------------------
2 2 * 8 * 8 * 8 = 1024
3 3 * 8 * 8 = 192
4 4 * 8 = 32
5 5
----- --------------------
2345 1253
您可以使用严格模式禁用它。请参阅规范的 §B.1.1。这样做会使 02345
出现语法错误。
所以这与toString
无关,只是您代码中的02345
不是您期望的值。
回复您更新后的问题:
why does the first set of code below not detect the number as an octal value but the second set of code does
因为在第一段代码中,您处理的不是数字,而是字符串。 window.prompt
returns 字符串,不是数字,即使你输入的全是数字。
即使您通过Number(num)
或+num
将字符串转换为数字,运行时字符串->数字转换的规则与解析JavaScript源代码的规则不同.
var x = 02345;
var y = x.toString("8");
alert(y);
这会给你 2345
前导零被解释为八进制值。
如果您需要将数字转换为带前导零的字符串,请使用我的方法,但只需像这样修改即可var y = "0" + x.toString("8")
var x = 02345;
var y = x.toString();
alert(y);
我意识到在 JavaScript 中使用 toString() 方法将前导零数字转换为字符串时出现问题。
从上面代码的输出可以看出,输出是1253
而不是所谓的02345
.
如果删除前导零,代码将按预期运行,为什么?上面的代码发生了什么,所以我可以将其更改为按预期工作。
var x = 2345;
var y = x.toString();
alert(y);
编辑:我问这个问题的原因是因为我有两个不同的代码,尽管非常相似,但它们的工作方式不同。看完这个问题与toString()方法无关,为什么下面的第一组代码没有将数字检测为八进制值,而第二组代码却检测到了。
var num=window.prompt(); // num = 0012222
var str = num.toString();
var result = [str[0]];
for(var x=1; x<str.length; x++)
{
if((str[x-1]%2 === 0)&&(str[x]%2 === 0))
{
result.push('-', str[x]);
}
else
{
result.push(str[x]);
}
}
alert(result.join('')); //Outputs : 0-012-2-2-2
其他代码:
function numberDash(num) {
var stringNumber = num.toString();
var output = [stringNumber[0]];
for (var i = 1; i < stringNumber.length; i++) {
if (stringNumber[i-1] % 2 === 0 && stringNumber[i] % 2 === 0) {
output.push('-', stringNumber[i]);
} else {
output.push(stringNumber[i]);
}
}
return output.join('');
}
numberDash(0012222) // Outputs : "52-6-6";
许多 JavaScript 引擎在规范中添加了八进制数字文字。前导零表示八进制(基数 8)。 2345
以 8 为基数(八进制)是 1253
以 10 为基数(十进制):
Octal Decimal ----- -------------------- 2 2 * 8 * 8 * 8 = 1024 3 3 * 8 * 8 = 192 4 4 * 8 = 32 5 5 ----- -------------------- 2345 1253
您可以使用严格模式禁用它。请参阅规范的 §B.1.1。这样做会使 02345
出现语法错误。
所以这与toString
无关,只是您代码中的02345
不是您期望的值。
回复您更新后的问题:
why does the first set of code below not detect the number as an octal value but the second set of code does
因为在第一段代码中,您处理的不是数字,而是字符串。 window.prompt
returns 字符串,不是数字,即使你输入的全是数字。
即使您通过Number(num)
或+num
将字符串转换为数字,运行时字符串->数字转换的规则与解析JavaScript源代码的规则不同.
var x = 02345;
var y = x.toString("8");
alert(y);
这会给你 2345
前导零被解释为八进制值。
如果您需要将数字转换为带前导零的字符串,请使用我的方法,但只需像这样修改即可var y = "0" + x.toString("8")