Grails — sortableColumn — принудительная числовая сортировка числовых строк

#string #grails #jquery-ui-sortable #numerical

#строка #grails #jquery-пользовательский интерфейс-сортируемый #числовая

Вопрос:

У меня есть число, хранящееся в моей базе данных в виде строк, и я хотел бы отсортировать их численно, используя Grails sortableColumns . Есть ли способ сделать это?

Комментарии:

1. Почему вы храните числа в своей базе данных в виде строк??

2. Идея заключалась в создании таблицы только для отображения. У меня есть таблица, которая затем предназначена для отображения, и эти числа должны храниться в виде строк, поскольку нормой в Бразилии является кома для разделения цифр вместо точки

3. Форматированное представление числа является функцией отображения и не должно храниться в базе данных. База данных предназначена для хранения данных — поэтому она должна представлять данные, которые она хранит. Тривиально применить правильное форматирование во время отображения числа. Если вам нужно выполнить сортировку по нему, то у вас будет гораздо более низкая производительность сортировки строк в виде чисел (независимо от того, как вы это делаете). Не говоря уже обо всем остальном (сравнение и т. Д.) Тоже медленнее.

Ответ №1:

Хранение чисел в виде форматированных строк не позволяет им использовать преимущества собственной числовой сортировки. Взгляните на тег Grails FormatNumber, который может использовать желаемый язык для отображения десятичных разделителей, чтобы вы могли использовать фактические числовые данные и не хранить форматированную строку для целей отображения.

Если класс домена, который вы хотите отсортировать, содержит как форматированные, так и неформатированные числовые данные, вы можете попробовать что-то вроде этого, заменив параметр столбца сортировки по мере необходимости:

 def list = {

  if (params?.sort == 'formattedNumber') {
    params.sort = 'rawNumber'
  }

  [ records : Record.list(params) ]
}
  

Если в вашем классе домена есть только форматированная строка, вы можете попробовать проанализировать ее в BigDecimal (или любой другой соответствующий числовой тип), но это может не работать должным образом, если языковой стандарт вашего сервера не соответствует десятичному разделителю строкового формата.

 def list = {

  def records = (params?.sort == 'formattedNumber') Record.list().sort{ it.formattedNumber.toBigDecimal() : Record.list(params)
  }

  [ records : records ]
}