В моем доменном объекте есть поле, которое я определяю как целое число ...
Integer minPrice
Затем я получаю к нему доступ на странице GSP следующим образом:
${fieldValue(bean: myBean, field: 'minPrice')}
и то, что я получаю в своем HTML, это ...
100,000
, который не является целым числом, это строка. Что еще хуже, это отформатированная строка в определенной локали.
Это проблема, потому что у меня есть элемент управления SELECT в HTML FORM, который имеет (не порядковый) диапазон значений для minPrice, который я хочу сохранить в своем доменном объекте как целые числа, и я не хочу хранить индекс для некоторого массива значений, между которыми я должен неоднократно отображаться, я хочу само значение.
Мой элемент управления выглядит следующим образом ...
<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"
/>
Когда я получаю значение из поля SELECT для отправки обратно на сервер, оно правильно имеет целочисленное значение, которое я сохраняю. Однако обратная поездка никогда предварительно не выбирает правую строку в раскрывающемся списке, поскольку значением является строка, разделенная запятыми.
Это хорошо работает в другом месте в моем коде для небольших чисел, где форматирование запятых не вступает в игру, и круговая передача в и из SELECT успешна. Но значения> 999 не работают.
В документах написано "Этот тег будет проверять компонент, который был объектом привязки данных, и получать значение поля либо из первоначально переданного значения, содержащегося в объекте ошибок компонента, заполняемого во время привязки данных, либо из значение свойства бина. Как только значение получено, оно будет автоматически закодировано в HTML. "
Это последний бит, которого я хочу избежать, поскольку он выглядит для форматирования целых чисел. Итак, какую небольшую часть магии Grails / GSP мне нужно знать, чтобы я мог вывести мое Integer как целое число в мой SELECT и предварительно выбрать правильный ряд?
EDIT:
Я попробовал кое-что еще, основываясь на ответах ниже, с довольно разочаровывающими результатами ...
Если я добавлю тег <gformatNumber/>
в свой <g:select/>
, я получу код страницы в виде текста в браузере.
<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"
/>
Использование тега числового формата из GSP для моего целочисленного значения 100000, как это ...
var x = <g:formatNumber number="${fieldValue(bean: personInstance, field: 'minPrice')}" format="#" />;
дает 100
. Помните, что fieldValue
возвращает 100,000
, так что это не удивительно.
Если я использую jsp taglib, как это ...
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
var y = <fmt:formatNumber value="${fieldValue(bean: personInstance, field: 'minPrice')}" pattern=".00"/>;
Я получаю сообщение об ошибке от компилятора страницы Cannot format given Object as a Number
.
Полагаю, у меня есть более широкие опасения, чем то, что я не могу получить значение Integer как подлинное целое число в моем коде, если оно больше 999 из-за поведения по умолчанию (и не настраиваемого) директивы fieldValue. Однако моя конкретная проблема невозможности предварительно выбрать целочисленное значение в элементе управления SELECT не исчезла. В данный момент я немного растерялся.
У кого-нибудь есть еще идеи?