Рейтинг:0

Как заставить поле с плавающей запятой принимать десятичные значения?

флаг us

Я использую Drupal 7 и имею поле с плавающей запятой. Используется для ввода цен.

Большинство цен, которые я ввожу, имеют десятичные дроби (например, 101,82, 99,88). Некоторые цены имеют отрицательные значения (например, -55,52, -1009,88).

Иногда, когда я ввожу десятичное значение, Drupal удаляет десятичное значение. (Например, 101,82 станет 101,00). В других случаях он сохранит десятичное значение.

Кажется, нет никакой рифмы или причины, почему он сохраняет десятичные значения для некоторых полей и опускает их для других полей.

Как я могу гарантировать, что он всегда сохраняет десятичное значение?

флаг cn
Звучит так: https://www.drupal.org/forum/support/post-installation/2011-05-19/float-field-gets-rounded-to-one-decimal-point-on-save
big_smile avatar
флаг us
@RyanHartman Спасибо! Приведенное там решение похоже для Durpal 8. Знаете ли вы, как я могу перевести его для Durpal 7? Заранее спасибо!
Рейтинг:1
флаг cn

Ваши значения с плавающей запятой работают правильно. Важно понимать, когда использовать число с плавающей запятой, а когда использовать поле десятичного типа. В вашей ситуации, использование десятичного поля кажется лучшим решением. Посмотрите эти две вики-страницы, в которых рассказывается, как вы будете использовать их в Drupal.

Плавать

Плавающая точка — это то, что смущает многих людей. Числа с плавающей запятой — это, по сути, числа, хранящиеся в экспоненциальном представлении, почти то же самое, что мы изучали на уроках математики в школе... Плавающие и двойные числа используются для хранения оценочных значений. Числа, которые они хранят, могут быть точными только до определенной точности.

Десятичный (числовой)

Это позволяет вам указать точность и масштаб числа... используйте тип данных DECIMAL для хранения точных числовых значений, где нам не нужно округление, а точные и точные значения.

Как преобразовать поле

Для этого вам нужно будет создать простой модуль и активировать его в Drupal. Начать с следуя шагам 1-4 этой вики-страницы Drupal. После этого выполните следующие действия:

  1. Скопируйте новый файл ****.module, который вы создали на шагах 3-4, и измените расширение на ****.install, чтобы у вас было два файла, оба с <?php с начала.
  2. Внутри файла ****.install вам нужно добавить функцию обновления, которую может запускать Drupal.
  3. Получив эту функцию, вы поместите код из этот ответ внутри.
  4. Вы захотите настроить переменные в скрипте в соответствии с вашей конфигурацией, т.е. $поле, точность, шкала, не ноль.
  5. Сделайте резервную копию базы данных и будьте готовы вернуться к резервной копии, если что-то пойдет не так.
  6. Активируйте новый модуль, что я предлагаю вам сделать из командной строки через drush en your_module_name.

Если ваш веб-сайт не слишком велик, вам может сойти с рук это, но если он большой, вам придется изучить свои варианты, потому что в конечном итоге PHP истечет время ожидания.

big_smile avatar
флаг us
Можно ли в Drupal 7 преобразовать поле с плавающей запятой в десятичное поле? У меня уже есть сотни значений в поле с плавающей запятой (я знаю, что некоторые из них не будут правильными, но мне просто придется с этим смириться). Спасибо!
флаг cn
@big_smile используйте https://drupal.stackexchange.com/a/151367/20866 и отредактируйте скрипт, чтобы установить правильные «точность» и «масштаб».
флаг cn
@big_smile Извините! Я редактировал свой ответ несколько раз, когда понял, что мое первое решение не справится со всем, что вам нужно.
big_smile avatar
флаг us
Спасибо за вашу помощь! Я предполагаю, что я иду в PHPmyadmin> Имя базы данных> SQL. Затем поместите код в окно запроса и нажмите «Перейти». Это верно? Я получаю эту ошибку: «Во время анализа было обнаружено 3 ошибки. Неожиданный персонаж. (рядом с "$" в позиции 0) Неожиданное начало выступления. (рядом с "$" в позиции 0) Неизвестный тип оператора. (возле «поля» в позиции 1) SQL-запрос: $field = 'поле_транзакция_сумма' #1064 - У вас ошибка; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с '$field = 'field_transaction_amount'' в строке 1`
флаг cn
@big_smile Я обновил ответ, добавив более подробную информацию о сценарии.
big_smile avatar
флаг us
Спасибо огромное! `Вы захотите настроить переменные в скрипте, чтобы они соответствовали вашей конфигурации, т.е. $поле, точность, масштаб, а не нуль. Основываясь на статьях, на которые вы ссылаетесь, для цен (например, 28,53 или -15,99) «точность» и «масштаб» будут равны «2», и я бы оставил «не нуль». ` как `не нуль`. Это верно?
флаг cn
@big_smile Точность - это общее количество цифр, масштаб - это количество после запятой. Ваша шкала должна быть установлена ​​на 2, и вы можете оставить точность на 10. С точностью на 10 вы можете иметь 8 цифр перед десятичным числом, поэтому максимальное/минимальное значения будут +/-99 999 999,99 соответственно. Что касается `not null`, я думаю, вы бы установили его в TRUE, если бы ваше поле было обязательным.
big_smile avatar
флаг us
Я точно следовал инструкциям, но, похоже, это не работает. Машинное имя моего поля — field_transaction_amount, поэтому для сценария я ввел `$field = 'field_transaction_amount';`. Тем не менее, он по-прежнему остается полем с плавающей запятой как в пользовательском интерфейсе Drupal, так и в phpmyadmin. Я также запустил Drush CC All и зашел на mysite.com/update, но ничего не сделал (на странице обновлений даже не было никаких обновлений). Любые идеи? Спасибо за вашу постоянную помощь!
флаг cn
Вы включили модуль перед добавлением функции `hook_update_7000()`? Вы можете создать новую функцию `hook_update_7001` в своем установочном файле, и drupal обнаружит, что есть что-то новое для запуска. Скорее всего, вы найдете детали, необходимые для запуска обновления, по ссылке в № 2 в ответе.
Рейтинг:0
флаг us

Ответ Райана Хартмана лучше всего использовать. Однако вот альтернатива на случай, если этот ответ не сработает.

  1. Сделайте резервную копию вашей базы данных.
  2. Экспортируйте свою базу данных из phpmyadmin. Перед экспортом вы можете отсортировать таблицы по размеру, а затем очистить все таблицы кэша, если они слишком велики. Вы также можете очистить search_index.
  3. Откройте программное обеспечение в приложении, которое может читать большие файлы базы данных, например BBedit. Sublime не справляется с размером.
  4. Поиск âчисло_поплавок(убедитесь, что grep отключен)
  5. Вы найдете такие результаты:(23, 'имя_поля..., 'номер_плавающего числа', 'номер', 1, 'хранилище_поля_sql', 'хранилище_поля_sql', ….)
  6. Заменить 'число_поплавок' немного с 'число_десятичное',
  7. Повторите шаги 3-5 для всех экземпляров âчисло_поплавок.
  8. Теперь найдитеплавать
  9. Вы найдете многострочные записи, начинающиеся с:СОЗДАТЬ ТАБЛИЦУ field_data_field_name( ¨В нескольких строках у них будет такая строка: ¨ field_name float ПО УМОЛЧАНИЮ NULL
  10. Замените слово плавать на «десятичный (10,2)».
  11. Повторите шаги с 8 по 10 для всех экземпляров âплавать. Однако при поиске вы встретите записи, которые не ссылаются на поля, например search_index и общая сумма поиска. Не изменяйте их.
  12. Сохраните файл и импортируйте в Phpmyadmin. Проверьте в Drupal, чтобы убедиться, что все в порядке.

Совет: перед экспортом на шаге 2 перейдите в Drupal и создайте фиктивное поле, использующее десятичное число. (Дайте ему имя, которое легко найти, например ааааа). Заполните его фиктивными записями в Drupal.Затем, когда вы экспортируете свою базу данных, вы можете изучить, как Drupal обрабатывает десятичные поля, чтобы вы знали, как лучше изменить ваши поля с плавающей запятой в базе данных.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.