Форматирование числового поля INPUT (javaScript)
В рамках очередной заметки, публикую этот пост, о том как отформатировать HTML поле INPUT с введенным в него значением стоимости (числа с кучей нолей). Для чего это нужно? В первую и основную очередь это повышает юзабилити заполняемой формы и всего сайта. Представьте если пользователю приходится заполнять числами (цена, площадь) множество полей, и во всех полях что-то вида: 10000000 или 150000000 — какое это число? — согласитесь, без разбора на отдельные части, бегая глазами по нулям, расставляя пробелы в уме — непонятно… Куда было бы лучше, если заполненные поля имели бы вид: 10 000 000 и 150 000 000 соответственно.
Для решения этой простой задачи можно воспользоваться следующей JavaScript функцией:
function clear_value(obj_id, event) { code = (event.charCode) ? event.charCode : event.keyCode; if(code != 9 && code != 16){ document.getElementById(obj_id).value = ''; } } function format_price(e) { var target = e.target || e.srcElement; var cursorPos = get_cursor_position(target); if (cursorPos == -1) { cursorPos = 0; } var deltaPos = 0; var lengthBefore = target.value.length; target.value = target.value.replace(/\s+/g,'').replace(/\s+$/, ''); target.value = format_num(target.value); if (!deltaPos && (target.value.length - lengthBefore) > 0) { deltaPos = target.value.length - lengthBefore; } if (!deltaPos && target.value[ cursorPos + deltaPos ] == ' ' && target.value[ cursorPos + deltaPos - 1 ] == ' ') { deltaPos += 2; } set_cursor_position(target, cursorPos + deltaPos); return true; } function get_cursor_position(inputEl) { if (document.selection && document.selection.createRange) { var range = document.selection.createRange().duplicate(); if (range.parentElement() == inputEl) { range.moveStart('textedit', -1); return range.text.length; } } else if (inputEl.selectionEnd) { return inputEl.selectionEnd; } else return -1; } function set_cursor_position(inputEl, position) { if (inputEl.setSelectionRange) { inputEl.focus(); inputEl.setSelectionRange(position, position); } else if (inputEl.createTextRange) { var range = inputEl.createTextRange(); range.collapse(true); range.moveEnd('character', position); range.moveStart('character', position); range.select(); } } function format_num(str) { var retstr = ''; var now = 0; for (i = str.length - 1; i >= 0; i--) { if (now < 3) { now++; retstr = str.charAt(i) + retstr; } else { now = 1; retstr = str.charAt(i) + ' ' + retstr; } } return retstr; } |
Код HTML при этом будет выглядеть следующим образом:
<form> <input onkeyup="format_price(event)" name="full_price" size="20" type="text" /> </form> |
Как видите, при каждом нажатии клавиши, вызывается функция format_price(event), с передачей ей текущего значения поля. Затем функция обрабатывает значение, расставляя пробелы там где это необходимо и возвращает отформатированное число обратно в поле.
Внимания! Переданные таким образом значение следует отчищать от пробелов в них. Если вы принимаете данные формы скриптом PHP, то полученное значение обрабатываем следующим образом:
$full_price=intval(str_replace(' ','',$_POST['full_price'])); // удаляем все пробелы и преобразуем полученное значение в INT |
Такой метод форматирования работает во всех современных браузерах, а также без проблем работает в IE6 и ему подобных) (на более ранних версиях тестирование не проводилось).
Надеюсь кому-то пригодятся, если будут вопросы или предложения по улучшению функции то пишите в комментариях, не стесняйтесь)
Похожие записи
1 Comment to “Форматирование числового поля INPUT (javaScript)”
Оставить комментарий
Senior, Architector
предложить оффер
- Исполнитель пропал, почему такое случается и понять с кем работать? спросил (а) Артем
- Можно ли WordPress считать универсальным движком? спросил (а) Андрей
- Что такое самописный скрипт или CMS? спросил (а) Антон
- Как при поиске в linux используя grep, добавить исключения? спросил (а) Алексей
- Как создать публичный ключ в RSA? спросил (а) Сергей
- Интеграция Тинькофф банк Эквайринг на сайт для приема платежей к записи
- Скрипт парсинга форума к записи
- Интеграция по API с страховым маркетплейсом INSSMART к записи
- Интеграция Тинькофф банк Эквайринг на сайт для приема платежей к записи
- Joomla не пускает в админку к записи
- Все что нужно для работы с WSDL к записи
- Интеграция по API с страховым маркетплейсом INSSMART к записи
Archive
- +2023 (2)
- Март 2023 (1)
- Февраль 2023 (1)
- +2022 (21)
- Декабрь 2022 (11)
- Ноябрь 2022 (1)
- Май 2022 (2)
- Апрель 2022 (2)
- Март 2022 (3)
- Февраль 2022 (1)
- Январь 2022 (1)
- +2021 (17)
- Декабрь 2021 (5)
- Ноябрь 2021 (2)
- Июль 2021 (1)
- Июнь 2021 (2)
- Май 2021 (5)
- Апрель 2021 (1)
- Март 2021 (1)
- +2020 (20)
- Декабрь 2020 (6)
- Сентябрь 2020 (2)
- Август 2020 (1)
- Июль 2020 (2)
- Май 2020 (2)
- Апрель 2020 (2)
- Март 2020 (2)
- Февраль 2020 (1)
- Январь 2020 (2)
- +2019 (18)
- Декабрь 2019 (3)
- Ноябрь 2019 (2)
- Октябрь 2019 (2)
- Сентябрь 2019 (1)
- Август 2019 (2)
- Июль 2019 (1)
- Июнь 2019 (1)
- Апрель 2019 (2)
- Март 2019 (1)
- Февраль 2019 (3)
- +2018 (44)
- Декабрь 2018 (4)
- Ноябрь 2018 (7)
- Октябрь 2018 (8)
- Сентябрь 2018 (1)
- Август 2018 (4)
- Июль 2018 (5)
- Май 2018 (3)
- Апрель 2018 (7)
- Март 2018 (1)
- Февраль 2018 (2)
- Январь 2018 (2)
- +2017 (19)
- Декабрь 2017 (2)
- Ноябрь 2017 (1)
- Октябрь 2017 (1)
- Сентябрь 2017 (2)
- Июль 2017 (1)
- Июнь 2017 (1)
- Май 2017 (2)
- Апрель 2017 (3)
- Март 2017 (2)
- Февраль 2017 (1)
- Январь 2017 (3)
- +2016 (37)
- Декабрь 2016 (3)
- Ноябрь 2016 (3)
- Октябрь 2016 (2)
- Сентябрь 2016 (3)
- Август 2016 (7)
- Июнь 2016 (3)
- Май 2016 (3)
- Апрель 2016 (3)
- Март 2016 (1)
- Февраль 2016 (1)
- Январь 2016 (8)
- +2015 (36)
- Ноябрь 2015 (5)
- Октябрь 2015 (4)
- Сентябрь 2015 (1)
- Август 2015 (8)
- Июнь 2015 (1)
- Май 2015 (4)
- Апрель 2015 (8)
- Март 2015 (3)
- Февраль 2015 (2)
- +2014 (26)
- Ноябрь 2014 (2)
- Октябрь 2014 (5)
- Сентябрь 2014 (6)
- Июль 2014 (1)
- Июнь 2014 (2)
- Май 2014 (3)
- Апрель 2014 (6)
- Февраль 2014 (1)
- +2013 (27)
- Декабрь 2013 (2)
- Ноябрь 2013 (1)
- Октябрь 2013 (1)
- Август 2013 (1)
- Июль 2013 (3)
- Июнь 2013 (10)
- Май 2013 (1)
- Апрель 2013 (2)
- Февраль 2013 (3)
- Январь 2013 (3)
- +2012 (42)
- Декабрь 2012 (2)
- Ноябрь 2012 (3)
- Октябрь 2012 (7)
- Сентябрь 2012 (2)
- Август 2012 (1)
- Июль 2012 (3)
- Июнь 2012 (2)
- Май 2012 (6)
- Апрель 2012 (2)
- Март 2012 (8)
- Февраль 2012 (5)
- Январь 2012 (1)
- +2011 (57)
- Декабрь 2011 (6)
- Ноябрь 2011 (2)
- Октябрь 2011 (3)
- Сентябрь 2011 (5)
- Август 2011 (4)
- Июль 2011 (3)
- Июнь 2011 (3)
- Май 2011 (3)
- Апрель 2011 (4)
- Март 2011 (10)
- Февраль 2011 (5)
- Январь 2011 (9)
- +2010 (43)
- Декабрь 2010 (7)
- Ноябрь 2010 (21)
- Октябрь 2010 (14)
- Сентябрь 2010 (1)
Свежие записи
- Почему на сайте, что-то может «само» сломаться? 16.03.2023
- Как быстро писать статьи под низкочастотные запросы 28.02.2023
- Разработка сайта для Андрея Ковалёва 30.12.2022
- Разработка плагина для WordPress — Аудиогид 12.12.2022
- Оптимизация скорости работы сайта, поиск слабых мест (от CPU до MySQL) 07.12.2022
Почему то не хочет работать, вернее внешне все форматирует, но при передаче через форму в код не запоминается
Каждую веденную цифру я обрабатываю так:
$summa_kredita=trim($_REQUEST[«summa_kredita»]);
$summa_kredita=stripslashes($summa_kredita);
$summa_kredita=str_replace(«,»,».»,$summa_kredita);
$summa_kredita=floatval($summa_kredita);
почему то думаю что где то конфликтует с $full_price=intval(str_replace(‘ ‘,»,$_POST[‘full_price’]));, не подскажите???