2013-08-27 43 views
0

我的測試情況是這樣的:通過數目到Grails的標籤庫

def formattedDiv = {attrs, body -> 
    Number numerator = attrs.get('numerator') as Number 
    Number denominator = attrs.get('denominator') as Number 

不過,我得到了一些格式錯誤:

void testFormattedDiv() { 
    String template = """<itld:formattedDiv numerator="1" denominator="1" format="###,###" nullNotifier="-"/>""" 
    String output = applyTemplate(template) 
    assertEquals "0", output 
} 

我的taglib代碼以關閉。

Cannot cast object '1' with class 'java.lang.String' to class 'java.lang.Number' 

傳遞數字的正確方法是什麼?

回答

2

使用大括號(請注意,我已經改變了模板,以一個單引號,而不是雙引號字符串停止Groovy的太快解釋${}表達式):

String template = '''<itld:formattedDiv numerator="${1}" denominator="${1}" format="###,###" nullNotifier="-"/>''' 

隨着GSP標籤調用,如果標記屬性的全部內容是${}表達式,則表達式的值將直接作爲其本機類型傳遞給標記,而不首先轉換爲字符串。但請注意,如果屬性值中還有其他內容以及${}表達式(例如, ex="${ample}_1"轉換爲字符串。

+0

不錯,並感謝字符串轉換的解釋。 – Interlated

0

你可以添加一些代碼來解析字符串到一個有效的數字(在你的taglib中)。

如果你看看FormatTagLib的來源 - 你會發現默認的grails標籤庫也可以做這樣的處理。

DecimalFormat decimalFormat = new DecimalFormat() 
def numerator = attrs.get('numerator') 

if (!(numerator instanceof Number)) { 
    numerator = decimalFormat.parse(numerator as String) 
}