Grails中输入字段的动态格式化(小数)

时间:2013-03-27 07:44:19

标签: grails formatting decimal input-field

我有一个“Trade”类,其属性为BigDecimal类型的“initialPrice”。这个属性可以 具有不同的小数,取决于另一个类“符号”中包含的属性“小数”,因此需要不同的格式,例如“#,### 0。##”,“#,### 0。#####”等 这对输出字段没有问题 - 我做了一个TagLib来解决这个问题。

问题在于输入字段。默认值是我的3轮小数,所以如果你使用超过3个decmals,你将在更新时丢失它们。

我不知道在这里如何或甚至可以使用我的TagLib。我一直在尝试很多不同的方法,但都没有。

这是我的TagLib:

class PriceTagLib {
    def fmtPrice = {attrs, body->
        def BigDecimal number = attrs.number
        def int noOfDecimals = attrs.decimals
        switch (noOfDecimals) {
           case 1: out <<new DecimalFormat('###,##0.#').format(number)
            break
           case 2: out << new DecimalFormat('###,##0.##').format(number)
            break
           case 3: out << new DecimalFormat('###,##0.###').format(number)
            break
           case 4: out << new DecimalFormat('###,##0.####').format(number)
            break
           case 5: out << new DecimalFormat('###,##0.#####').format(number)
        }
    }
}  

这是我的课程......

class Symbol {
    String          name            //The name of the symbol e.g. EURUSD, USDCAD etc.
    int             decimals

    static hasMany = [trades:Trade]

}


class Trade {
    static belongsTo = [symbol:Symbol, strategy:Strategy]
    static hasMany = [positions:Position]

    BigDecimal      initialPrice
    Symbol          symbol
    Strategy        strategy
    Position        positions

    static constraints = {
    type(inList:["Sell", "Buy"])
        initialPrice(scale:5)
        positions(nullable:true)
    }

}

这来自show.gsp,它按我的意思运作:

<span class="property-value" aria-labelledby="initialPrice-label"><g:fmtPrice decimals="${tradeInstance.symbol.decimals}" number="${tradeInstance.initialPrice}"></g:fmtPrice></span>

这是我需要修改的行 - 即我需要在“value”参数的引号之间写入。 也许我需要更换整条生产线? 该行位于_form.gsp模板中。

<g:field name="initialPrice" value="${tradeInstance.initialPrice}" required=""/>

希望任何人都可以对此有所帮助。

提前感谢...

1 个答案:

答案 0 :(得分:1)

您只需在value属性中调用标记lib:

<g:field name="initialPrice" value="${g.fmtPrice(decimals: tradeInstance.symbol.decimals, number: tradeInstance.initialPrice)}" required=""/>