Ho un campo nel mio oggetto di dominio che io definisco come un intero ...Come posso modificare il modo in cui GRAILS GSP fieldValue formats Integers?
Integer minPrice
Ho poi accedere in una pagina SPG come segue:
${fieldValue(bean: myBean, field: 'minPrice')}
e quello che ho nel mio HTML è ...
100,000
che non è un numero intero, è una stringa. Peggio ancora, è una stringa formattata in un particolare locale.
Questo è un problema perché ho un controllo SELECT su un FORM HTML che ha un intervallo (non ordinale) di valori per minPrice che voglio memorizzare nel mio oggetto dominio come numeri interi, e non voglio memorizza un indice su una serie di valori che devo mappare ripetutamente avanti e indietro, voglio il valore stesso.
mio controllo di selezione si presenta così ...
<g:select name="minPrice"
value="${fieldValue(bean: personInstance, field: 'minPrice')}"
onchange="setDirty()"
noSelection='${['0':'Select a number...']}'
from="${[
['name':'100,000', 'id':100000],
['name':'200,000', 'id':200000],
['name':'300,000', 'id':300000]
]}"
optionKey="id" optionValue="name"
/>
Quando ottengo il valore dal campo SELECT per inviare al server ha correttamente un valore intero, che io insisto. Tuttavia, il viaggio di ritorno non seleziona mai la riga corretta nel menu a discesa perché il valore è una stringa separata da virgole.
Questo funziona bene altrove nel mio codice per i piccoli numeri in cui la formattazione della virgola non entra in gioco, e il round-trip dentro e fuori il SELECT ha successo. Ma i valori> 999 non funzionano.
I documenti dicono "Questo tag ispezionare un fagiolo che è stata oggetto di associazione dati e ottenere il valore del campo sia dal valore originariamente presentato contenuta all'interno errori del bean dell'oggetto popolamento durante associazione dei dati oppure dal valore della proprietà di un bean. Una volta ottenuto il valore, verrà automaticamente codificato in HTML. "
È l'ultimo bit che voglio evitare in quanto sembra formattare gli interi. Quindi, quale piccola parte della magia Grails/GSP devo conoscere per poter ottenere il mio intero da rendere come intero nella mia SELECT e preselezionare la riga giusta?
EDIT: Ho provato alcune cose ulteriormente sulla base delle risposte di seguito, con risultati piuttosto deludenti finora ...
Se metto il tag <gformatNumber/>
nel mio <g:select/>
ottengo il codice della pagina come testo nel browser.
<g:select name="minPrice"
value='<g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />'
onchange="setDirty()"
noSelection='${['0':'Select a number...']}'
from="${[
['name':'100,000', 'id':100000],
['name':'200,000', 'id':200000],
['name':'300,000', 'id':300000],
]}"
optionKey="id" optionValue="name"
/>
Utilizzando il tag formato numerico da GSP sul mio valore intero di 100000 come questo ...
var x = <g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />;
dà 100
. Ricorda che il fieldValue
restituisce 100,000
, quindi questa non è una sorpresa.
Se uso il taglib jsp come questo ...
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
var y = <fmt:formatNumber value="${fieldValue(bean: personInstance, field: 'minPrice')}" pattern=".00"/>;
ottengo un errore dalla pagina compilatore Cannot format given Object as a Number
.
Credo di avere un problema più ampio di quello che non riesco a ottenere un valore intero come un intero vero e proprio nel mio codice, se è superiore a 999 a causa del default (e non configurabile) il comportamento della direttiva fieldValue. Tuttavia il mio problema specifico di non essere in grado di preselezionare un valore intero in un controllo SELECT non sta andando via. Al momento sono un po 'in perdita.
Chiunque ha altre idee?
Non riesco a far funzionare nessuna di queste soluzioni ... vedi modifica sopra. In retrospettiva è ovvio, se fosse semplicemente Java non avrei bisogno di un formattatore di numeri, avrei bisogno di Integer.parseInt() per ottenere il risultato da fieldValue nel tipo giusto. Questo non può essere così difficile ... cosa sto sbagliando? – Simon