Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Форматирование в input ценовой информации c десятичной дробью. (https://javascript.ru/forum/dom-window/51453-formatirovanie-v-input-cenovojj-informacii-c-desyatichnojj-drobyu.html)

Anastasi_ 07.11.2014 07:30

Форматирование в input ценовой информации c десятичной дробью.
 
Пожалуйста подскажите - как во время ввода числа в input сделать так, чтобы оно динамически форматировало данные по три знака с пробелом и после точки еще 2 числа можно ввести.
Например: ввод числа 1048766.75 сразу форматировало на 1 048 766.75?

ksa 07.11.2014 08:21

Цитата:

Сообщение от Anastasi_
ввод числа 1048766.75 сразу форматировало на 1 048 766.75?

http://javascript.ru/forum/misc/4381...ulyarkojj.html

Anastasi_ 07.11.2014 10:54

Цитата:

Сообщение от ksa (Сообщение 339547)

Это не совсем то. Можно вводить только числовую информацию, немного доработала, но не могу сообразить как сделать, чтобы только одну точку можно было ввести
function splitNums(delimiter, str){
    str = str.replace(/[^(\d)*((\.){1}?\d*)?$]/g, "");
    str = str.replace(/(\d+)(\.\d+)?/g,
    function (c, b, a) {
      return b.replace(/(\d)(?=(\d{3})+$)/g, '$1' + delimiter) + (a ? a : '')
    }
  );
    return str;
  }

А то сейчас можно ввести и такое "444..554...97"
Подскажите, пожалуйста.

ksa 07.11.2014 11:54

Цитата:

Сообщение от Anastasi_
не могу сообразить как сделать, чтобы только одну точку можно было ввести

Как вариант...

var re=/^\d+(.\d+)?$/;
var str='1234.1'
if (re.test(str)) {
	alert('Ok');
} else {
	alert('No');
};

ksa 07.11.2014 11:57

Anastasi_, вот еще статейка...
http://miha.in/ru/articles/jsnumber

kostyanet 08.11.2014 10:28

Цитата:

Сообщение от Anastasi_
А то сейчас можно ввести и такое "444..554...97"

И что тогда будет?

Anastasi_ 14.11.2014 06:28

Было решено вот так:
//ввод чисел в формате
  function splitNums(delimiter, str) {
    if (str == '.') return '';
    str = str.replace(/[^\d\.]/g, "");
    str = str.replace(/(\.)(.*?)\1/ig, '$1$2');
    str = str.replace(/(\d+)(\.\d+)?/g,
      function (c, b, a) {
        return b.replace(/(\d)(?=(\d{3})+$)/g, '$1' + delimiter) + (a ? a : '')
      }
    );
    return str;
  }

Позволяет вводить только числа в формате 12 000.475. delimiter - любой разделитель, у меня пробел.
Может кто предложит проще...

krutoy 14.11.2014 15:00

мои 5 копеек
<html>
<head>
<meta charset="windows-1251">
</head>
<body>

<input id="input" />

<script>

input=document.querySelector("#input")
input.oninput=function(){
var s=this.value
s=s.replace(/(^\d|\d{3}\.\d{2}|\d{3}(?!($|\.)))/g, "$1 ")
s=s.replace(/\s+/g, " ")
this.value=s
}

</script>
 
</body>
</html>

Тут надо еще прибить валидацию. Например, такие числа как 11.11 следует считать недопустимыми, иначе работать не будет

kostyanet 14.11.2014 17:54

Блин, сколько геморроя-то. Вычислить ввод и вывести в формате не ортодоксально что ли?

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

Я даже проверил (хоть и так помнил) что даже в таких могучих програх как Корел или ФШ - ввод вычисляется и форматируется. Корел молча кладет на ошибки, ФШ пикает падла.

Но никому в голову не пришло в этих корпорациях запрещать вводить какие-то символы.

Избавляйтесь от синдрома вахтера. Юзер ввел - не тупой, а для тупых - бип и красная рамка - введи тупой правильно, вот так: пример.

kostyanet 14.11.2014 17:58

Более того, ТС вообще не понимает что все устроено в точности наоборот. Юзер вводит как хочет, а записывается - как надо. Затем при воспроизведении юзеру показывают как он привык.

Дебильный ввод попросту не имеет смысла, никакой дурак кроме воображаемого ТС не будет писать 123....456...789. Так не бывает.


Часовой пояс GMT +3, время: 12:32.