2

我有一些任意数字,在我的用例中介于 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()是我似乎得到了不一致的类型——有时是数字,有时是字符串。这样,类型总是被正确解析,并且不会抛出错误。

有没有更简单的方法来格式化一个看起来像钱的数字(整美元,以逗号分隔,以千为单位)?如果没有,我可以对我现有的代码做些什么来使它工作?

谢谢!

4

2 回答 2

2

我想出的解决方案如下。

//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(),只需要第一个.

于 2018-02-12T17:33:29.283 回答
-1

对于你的整数情况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>

如果值只有正数,可以删除(value<0?'-':'')+开头的。expression

我在这里发布了带小数的完整变体。

于 2020-03-17T01:01:27.277 回答