繁体   English   中英

Extendscript Javascript中的计算结果错误

[英]Calculation result wrong in Extendscript Javascript

我正在写一个InDesign脚本,我正在使用moments.js来计算日期。

当我使用日期格式“Do”时,它应返回前面的例子“1st,2nd,3rd,4th ......”,但是函数的计算结果是,返回错误的结果,结果如下:

1rd 2rd 3rd 4th 4th 6th 7th 8th 9th 10rd 11rd 12rd 13rd 14rd 15rd 17rd 18rd 19rd 20 21rd 22rd 23th 25th 26th 27th 28th 29th 30th 31rd

这是功能:

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 ,它返回正确的结果。

这是Extendscript中的一个已知问题吗? 你知道还有其他方法可以归还顺序吗? 任何解决方法?

提前致谢

您的代码也适用于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';
  }
}

看起来像ExtendScript不支持链式三元运算符。据我所知,它是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中的常见运算符关联性是从左到右。 但是,三元测试是从右到左 那意味着你的

output = (b === 1) ? 'st' : (b === 2) ? 'nd' : (b === 3) ? 'rd' : 'th';

(稍微简化) 首先选择(b === 1) ,可能的结果为'rd''th' - 最后两个。

另请参见示例用法? .. : ? .. :Mozilla的参考文献中 ,明确提到了关联性:

多个三元评估也是可能的(注意:条件运算符是右关联的):

 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雷克萨斯的回答表明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的帖子表明根据文档,这应该评估为“1rd”,“2rd”,“4rd”。 我将其保存为页面并加载到Chrome,IE和Safati中。 所有三个都给出了第1,第2和第4作为输出,响应1,2和4作为输入。

你能发布一些代码来支持你的答案吗? 根据您的说法,vanilla JavaScript引擎存在问题或文档中存在错误。

愿这条线有效吗?

 String(number).replace(/1$/, "1st").replace (/2$/, "nd").replace(/3$/, "rd").replace(/[4-9]$/, "th"); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM