我有一些任意的数字,在我的用例中是1,000到1,000,000之间。我需要将这个值格式化为一个显示值,在这个值中它被显示为货币。即1000 -> "$1,000"、100000 ->"$100,000"等。
我遇到的问题是我的表达式太大了,而AMP表达式又太有限了,所以很难按照我想要的方式格式化数字。我不能使用".replace()",也不能使用任何正则表达式,甚至使用基本的条件条件似乎都太难了(看起来我甚至不能使用标准的三元运算符: a?b:c;)。
这是我的资料
//tells me how many digits i have
amp-bind-macro#getLog10(arguments="num" expression="num.length - 1")
//determines if the number should have a comma after it
amp-bind-macro#numShouldHaveComma(arguments="log10" expression="log10%3==0 && log10!=0")
//function to be invoked by Array.map()
amp-bind-macro#formatNumber_map(arguments="char, ind, num" expression="(numShouldHaveComma(getLog10(round(num).toString().substr(ind+1))) && char+',') || char")
//main formatter function (1000 -> 1,000)
amp-bind-macro#formatNumber(arguments="num" expression="round(num).toString().split('').map((char,ind)=>formatNumber_map(char,ind, num)).join('')" )
//adds $ and calls the formatter
amp-bind-macro#formatMoney(arguments="val" expression="'$'+formatNumber(val)")我将一个显示元素设置为在滑块的值发生变化时调用formatMoney,例如
<input type='range' on="input-throttled:AMP.setState({state:{mySlider:{value:event.value}}})" /> 和
<div id='display-money' [text]="formatMoney(state.mySlider.value)">$1,000</div>这种特殊的方式使我的堆栈大小为53,这超过了允许的最大值50。
我使用round(num).toString()的原因是我得到的类型似乎不一致--有时是数字,有时是字符串。这样,类型始终被正确分析,并且不会引发任何错误。
有没有一种更简单的方法来格式化一个数字,使其看起来像钱(整美元,用逗号分隔)?如果没有,我可以对我现有的代码做些什么来使它工作?
谢谢!
发布于 2018-02-13 01:33:29
我提出的解决方案如下所示。
//determines how many "0's" there are.
amp-bind-macro#getLog10(arguments="num" expression="num.length - 1")
//determines if the number should have a comma after it
amp-bind-macro#numShouldHaveComma(arguments="log10" expression="log10%3==0 && log10!=0")
//helper function for formatNumber
amp-bind-macro#formatNumber_map(arguments="char, ind, numStr" expression="(numShouldHaveComma(getLog10(numStr.substr(ind)))) ? char+',' : char")
//main number formatter
amp-bind-macro#formatNumber(arguments="num, numStr" expression="numStr.split('').map((char,ind)=>formatNumber_map(char,ind, numStr)).join('')" )
//adds "$" and calls formatNumber
amp-bind-macro#formatMoney(arguments="val" expression="'$'+formatNumber(round(val), round(val).toString())")本质上,我通过显式地将数字作为数字和字符串传递给下一个函数,从而简化了表达式,这样我就不需要在每个宏中调用round(num).toString(),只需要在第一个宏中调用。
发布于 2020-03-17 09:01:27
对于整数情形formatNumber,我建议在一个amp-bind-macro中使用更紧凑的实现
<amp-bind-macro id="formatNumber" arguments="value" expression="(value<0?'-':'')+(abs(value)||0).toFixed().split('').map((v,i,a)=>(i&&(a.length-i)%3==0?',':'')+v).join('')"></amp-bind-macro>如果expression开头的仅为正数,则可以将其删除。
带十进制I posted here的完整变量。
https://stackoverflow.com/questions/48633500
复制相似问题