Extendscript 中的计算结果错误 Javascript
Calculation result wrong in Extendscript Javascript
我正在编写 InDesign 脚本并使用 moments.js 计算日期。
当我使用日期格式 "Do" 时,应该 return 例如“1st, 2nd, 3rd, 4th...”,但是函数的计算是 return =29=]s 一个错误的结果,结果是这样的:
第 1 名
第二名
第三名
第四名
5日
6日
7日
8号
9号
10号
11号
12号
13号
14日
15日
16日
17日
18日
19日
20日
21日
22日
23日
24日
25日
26日
27日
28日
29日
30号
第 31 名
这是函数:
function returnOrdinal(number) {
var b = number % 10,
output = (parseInt(number % 100 / 10) === 1) ? 'th' :
(b === 1) ? 'st' :
(b === 2) ? 'nd' :
(b === 3) ? 'rd' : 'th';
return number + output;
}
我创建了一个使用相同函数的 JSFiddle,它 return 得到了正确的结果。
这是 Extendscript 中的已知问题吗?你知道 return 序数的任何其他方法吗?任何解决方法?
提前致谢
您的代码也适用于 http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_basic,因此我怀疑回调环境会产生副作用。我建议尝试另一种可能对副作用不太敏感的写作方式。
function returnOrdinal(number) {
switch((number % 100 / 10).toFixed(0) == 1?0:number%10) {
case 1: return number+'st';
case 2: return number+'nd';
case 3: return number+'rd';
default: return number+'th';
}
}
这条线路行得通吗?
String(number).replace(/1$/, "1st").replace (/2$/, "nd").replace(/3$/, "rd").replace(/[4-9]$/, "th");
据我所知,ExtendScript.As 似乎不支持链式三元运算符,它是 ECMA 3。在 InDesign 中工作的另一个选项 - 只需使用 if else 或 switch
function returnOrdinal(number) {
var b = number % 10;
var output;
if (parseInt(number % 100 / 10) === 1) {
output = 'th';
} else {
switch (number) {
case 1:
output = 'st';
break;
case 2:
output = 'nd';
break;
case 3:
output = 'rd';
break;
default:
output = 'th';
}
}
return number + output;
}
根据文档,您的结果是正确的,而您的代码是错误的(令人惊讶的是,这意味着您使用其他 JavaScript 引擎进行的测试也是错误的)。
ECMAScript 中常见的运算符关联性是从左到右的。然而,三元测试是right to left。这意味着您的
output = (b === 1) ? 'st' : (b === 2) ? 'nd' : (b === 3) ? 'rd' : 'th';
(稍微简化)首先 选择 (b === 1)
,可能的结果是 'rd'
和 'th'
– 最后两个。
另请参阅 Mozilla's reference 中 ? .. :
的示例用法,其中明确提到了关联性:
Multiple ternary evaluations are also possible (note: the conditional operator is right associative):
var firstCheck = false,
secondCheck = false,
access = firstCheck ? "Access denied" : secondCheck ?
"Access denied" : "Access granted";
console.log( access ); // logs "Access granted"
用括号覆盖优先级使其按预期工作:
function returnOrdinal(number) {
var b = number % 10,
output = (parseInt(number % 100 / 10) === 1) ? 'th' :
((b === 1) ? 'st' :
((b === 2) ? 'nd' :
((b === 3) ? 'rd' : 'th')));
return number + output;
}
反驳 Rad Lexus 的回答表明 JSFiddle 和 InDesign 给出的正确答案存在问题。
我有以下测试页:
<html>
<head>
<script>
function test(num) {
var b = num;
var output = (b === 1) ? 'st' : (b === 2) ? 'nd' : (b === 3) ? 'rd' : 'th';
document.getElementById("ordinals").innerHTML = b + output;
}
</script>
</head>
<body onload="test(1);">
<div id="ordinals">test
</div>
</body>
</html>
Rad 的 post 建议根据文档将其计算为“1rd”、“2rd”、“4rd”。我将它保存为一个页面并加载到 Chrome、IE 和 Safati 中。这三个都给我第 1、第 2 和第 4 作为输出,以响应 1,2 和 4 作为输入。
你能post一些代码来支持你的答案吗?根据您的说法,vanilla JavaScript 引擎有问题或文档有错误。
我正在编写 InDesign 脚本并使用 moments.js 计算日期。
当我使用日期格式 "Do" 时,应该 return 例如“1st, 2nd, 3rd, 4th...”,但是函数的计算是 return =29=]s 一个错误的结果,结果是这样的:
第 1 名 第二名 第三名 第四名 5日 6日 7日 8号 9号 10号 11号 12号 13号 14日 15日 16日 17日 18日 19日 20日 21日 22日 23日 24日 25日 26日 27日 28日 29日 30号 第 31 名
这是函数:
function returnOrdinal(number) {
var b = number % 10,
output = (parseInt(number % 100 / 10) === 1) ? 'th' :
(b === 1) ? 'st' :
(b === 2) ? 'nd' :
(b === 3) ? 'rd' : 'th';
return number + output;
}
我创建了一个使用相同函数的 JSFiddle,它 return 得到了正确的结果。
这是 Extendscript 中的已知问题吗?你知道 return 序数的任何其他方法吗?任何解决方法?
提前致谢
您的代码也适用于 http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_basic,因此我怀疑回调环境会产生副作用。我建议尝试另一种可能对副作用不太敏感的写作方式。
function returnOrdinal(number) {
switch((number % 100 / 10).toFixed(0) == 1?0:number%10) {
case 1: return number+'st';
case 2: return number+'nd';
case 3: return number+'rd';
default: return number+'th';
}
}
这条线路行得通吗?
String(number).replace(/1$/, "1st").replace (/2$/, "nd").replace(/3$/, "rd").replace(/[4-9]$/, "th");
据我所知,ExtendScript.As 似乎不支持链式三元运算符,它是 ECMA 3。在 InDesign 中工作的另一个选项 - 只需使用 if else 或 switch
function returnOrdinal(number) {
var b = number % 10;
var output;
if (parseInt(number % 100 / 10) === 1) {
output = 'th';
} else {
switch (number) {
case 1:
output = 'st';
break;
case 2:
output = 'nd';
break;
case 3:
output = 'rd';
break;
default:
output = 'th';
}
}
return number + output;
}
根据文档,您的结果是正确的,而您的代码是错误的(令人惊讶的是,这意味着您使用其他 JavaScript 引擎进行的测试也是错误的)。
ECMAScript 中常见的运算符关联性是从左到右的。然而,三元测试是right to left。这意味着您的
output = (b === 1) ? 'st' : (b === 2) ? 'nd' : (b === 3) ? 'rd' : 'th';
(稍微简化)首先 选择 (b === 1)
,可能的结果是 'rd'
和 'th'
– 最后两个。
另请参阅 Mozilla's reference 中 ? .. :
的示例用法,其中明确提到了关联性:
Multiple ternary evaluations are also possible (note: the conditional operator is right associative):
var firstCheck = false, secondCheck = false, access = firstCheck ? "Access denied" : secondCheck ? "Access denied" : "Access granted"; console.log( access ); // logs "Access granted"
用括号覆盖优先级使其按预期工作:
function returnOrdinal(number) {
var b = number % 10,
output = (parseInt(number % 100 / 10) === 1) ? 'th' :
((b === 1) ? 'st' :
((b === 2) ? 'nd' :
((b === 3) ? 'rd' : 'th')));
return number + output;
}
反驳 Rad Lexus 的回答表明 JSFiddle 和 InDesign 给出的正确答案存在问题。
我有以下测试页:
<html>
<head>
<script>
function test(num) {
var b = num;
var output = (b === 1) ? 'st' : (b === 2) ? 'nd' : (b === 3) ? 'rd' : 'th';
document.getElementById("ordinals").innerHTML = b + output;
}
</script>
</head>
<body onload="test(1);">
<div id="ordinals">test
</div>
</body>
</html>
Rad 的 post 建议根据文档将其计算为“1rd”、“2rd”、“4rd”。我将它保存为一个页面并加载到 Chrome、IE 和 Safati 中。这三个都给我第 1、第 2 和第 4 作为输出,以响应 1,2 和 4 作为输入。
你能post一些代码来支持你的答案吗?根据您的说法,vanilla JavaScript 引擎有问题或文档有错误。