AEJoy —— 表达式之通用计数与货币格式化程序【JS】

1,094 阅读2分钟

效果图

下面的几个示例演示了如何通过操纵几个变量来控制计数的开始和结束、计数的持续时间、计数是否使用美元符号和/或逗号格式化,以及小数点右侧的位数 101.gif

想法

这次我们想要创建一个通用计数器,它将在固定的时间内从一个值计数到另一个值。我们还希望能够轻松地用逗号格式化计数,为货币格式添加美元符号,并指定小数点右侧的位数。

设计

对于应用于文本层的源文本(Source Text)参数的表达式,这是一个完美的应用程序。我们将使用 AE 的 linear() 插值方法驱动计数器。这允许我们(用一行代码)轻松地将计数时间映射为计数范围。

作为奖励,这样做会自动给我们一个计数器,可以向上或向下计数。我们要倒数所要做的就是让开始的计数大于结束的计数。此外,当达到结束计数时,此方法将自动导致输出冻结。

对于格式化,我们可以利用几个 JavaScript 内建的方法来帮助我们实现目标。我们将使用字符串方法 substr() 执行插入逗号和 toFixed() 以处理小数的格式化等所需的操作。对于负数,我们将在格式化之前去掉符号,并在格式化之后重新应用它,连同一个可选的美元符号。

代码可能需要一段时间才能理解,但对于大多数应用程序,您应该能够将其粘贴到项目中,并修改代码开头的 6 个变量。

表达式代码

numDecimals = 2; ///< 小数位的个数
commas = true; ///< 为真则表示用逗号分隔三个数字为一组
dollarSign = true; ///< 是否现实美元符号
beginCount = -1999; ///< 计数器的开始与结束计数
endCount = 1999;
dur = 4; ///< 从开始计数到结束计数所花的时间(秒)

t = time - inPoint;
s = linear(t, 0, dur, beginCount, endCount).toFixed(numDecimals); ///< 将时间映射为计数范围

prefix = "";
if (s[0] == "-") { ///< 如果一开始有负号,则暂时先剔除
    prefix = "-";
    s = s.substr(1);
}
if (dollarSign) prefix += "$";

if (commas) { ///< 需要逗号处理

    /// @note 先将计数的小数部分剥离出来
    decimals = "";
    if (numDecimals > 0) {
        decimals = s.substr(-(numDecimals + 1));
        s = s.substr(0, s.length - (numDecimals + 1));
    }
    
    /// @note 然后每个三个数字为一组插入逗号
    outStr = s.substr(-s.length, (s.length - 1) % 3 + 1);
    for (i = Math.floor((s.length - 1) / 3); i > 0; i--) {
        outStr += "," + s.substr(-i * 3, 3);
    }
    /// @note 结合前缀、逗号格式化的整数、小数部分
    prefix + outStr + decimals;
} else { ///< 不需要逗号处理
    prefix + s;
}

JavaScript 字符串方法 substr() 用于从字符串中提取子字符串,并接受两个参数。第一个参数是从何处(索引从零开始)开始提取子字符串。这意味着 “0” 表示第一个字符,“1” 表示第二个字符,以此类推。第二个(可选)参数指定要提取多少字符。例如,表达式 ("abcdef").substr(1,3) 将返回 "bcd" 。第二个参数是可选的,如果省略,则返回从第一个参数到字符串末尾的字符。因此,表达式 ("abcdef").substr(1) 将返回 "bcdef" 。