Поле ввода с форматированием account.js, не позволяющее вводить десятичные числа

На моем веб-сайте satoshindex.com, когда я пытаюсь ввести число с десятичной запятой в верхнее поле ввода, он автоматически удаляет десятичная точка. Это также не позволяет мне выделять ввод с помощью Ctrl-A или использовать клавиши со стрелками для перехода к другой цифре в номере.

Я думаю, это как-то связано с Accounting.js.

Вот соответствующий код с моего сайта:

  var SAT = 0.00000001;
  var BIT = 0.000001;
  var MBIT = 0.001;
  var BTC = 1;
  var currentUnit = BTC;

Я знаю, что это как-то связано с этими строками в функциях btcConvert и usdConvert, потому что, когда я их удаляю, проблема исчезает, но для разделения чисел не используются запятые.

var decimals = decimalPlaces(input.value);
input.value = accounting.formatNumber(input.value, decimals)

Я думаю, проблема в том, что btcConvert вызывается каждый раз, когда вы вводите в поле ввода, а formatNumber удаляет десятичный разряд, но без formatNumber в btcConvert я не могу заставить его добавлять запятые к числу, когда оно выше 999, то же самое в Конвертировать в доллары.


person Darkstar    schedule 24.12.2015    source источник
comment
пожалуйста, создайте скрипку js или плункер   -  person brk    schedule 24.12.2015
comment
Все, что вам нужно увидеть, есть на satoshindex.com, что сделает jsfiddle?   -  person Darkstar    schedule 24.12.2015
comment
Как вы думаете, можно ли оттуда отлаживать? Также проверьте демонстрационные ролики на сайте Accounting.js, где разрешена десятичная точка. Зачем нужны оба onchange = btcConvert (this); onkeyup = btcConvert (this). А они делают то же самое.   -  person brk    schedule 24.12.2015
comment
Нет, извините, наверное, нет. 1 сек   -  person Darkstar    schedule 24.12.2015
comment
Я попытался воссоздать его в jsfiddle, но ничего не работает должным образом, и я не могу воссоздать ошибку.   -  person Darkstar    schedule 24.12.2015


Ответы (1)


Фактически вы можете ввести десятичное число, например 1234.5, если наберете .5 очень быстро или скопируете его в поле ввода. При нормальной скорости набора 1234. всегда превращается в 1234, прежде чем вы сможете добавить 5. Как вы подозреваете, account.js упрощает 1234. до 1234, потому что это то, что он считает каноническим форматом.

Итак, вы хотите, чтобы пользователь мог вводить 1234.0 и автоматически форматировать его до 1,234.0 в поле ввода. Я вижу три возможных подхода:

  • Измените код account.js. Отредактируйте accounting.formatNumber, чтобы десятичная точка не сбрасывалась, когда это последний символ input.value.

  • Не используйте account.js для форматирования поля ввода. Замените вызов accounting.formatNumber вызовом функции форматирования, которую вы пишете сами.

  • Быстрое и грязное решение: не изменяйте account.js и сохраняйте вызов accounting.formatNumber, но если input.value имеет десятичную точку в конце и вы получаете строку без десятичной точки, вставьте ее снова.

Один из способов применить быстрый и грязный подход к btcConvert - заменить эту строку:

input.value = accounting.formatNumber(input.value, decimals)

С этим:

var formatted = accounting.formatNumber(input.value, decimals);
if (input.value.indexOf('.') == input.value.length - 1 &&
    input.value.length != 0 &&
    formatted.charAt(formatted.length - 1) != '.') {
  formatted += '.';
}
input.value = formatted;

Проверка input.value.length != 0 необходима, потому что, если input.value - пустая строка, indexOf всегда будет возвращать -1, что равно input.value.length - 1 для пустого input.value.

person Michael Laszlo    schedule 24.12.2015
comment
Быстрый и грязный подход отлично подходит для десятичной точки, спасибо! Есть ли способ исправить проблему с клавишей со стрелкой / выделением? Когда вы используете клавиши со стрелками для перехода к другой цифре, скажем, вы ошиблись, она автоматически перемещает мигающую строку обратно в конец числа. Как это исправить? - person Darkstar; 24.12.2015
comment
Вы можете удалить onkeyup ="btcConvert(this);" из HTML, чтобы предотвратить вызов btcConvert, когда вы только перемещаетесь по тексту. Однако, если вы измените цифру в середине числа, курсор все равно переместится в конец. Чтобы исправить это правильно, вам нужно получить позицию курсора и сохраните его перед изменением input.value, затем верните курсор в его старую позицию потом. - person Michael Laszlo; 24.12.2015
comment
Если я удалю onkeyup = btcConvert (this); затем он ждет, пока я не выйду из поля ввода, чтобы отформатировать число вместо того, чтобы добавлять запятые при вводе. Есть ли способ сохранить эту функциональность, а также разрешить перемещение клавиш со стрелками? - person Darkstar; 24.12.2015
comment
Вы можете изменить btcConvert для сравнения форматированного текста с исходным вводом и обновлять поле ввода только в том случае, если форматированный текст отличается. Таким образом, вы должны заменить строку input.value = formatted; на if (input.value !== formatted) { input.value = formatted; };. - person Michael Laszlo; 24.12.2015
comment
Большое спасибо за помощь, я очень ценю это. Я реализовал функцию положения курсора, но поскольку она форматирует числа с помощью запятых, когда вы вводите, например, 123456 в первое поле ввода, это не работает. Он помещает 123564, потому что я думаю, что функция курсора считает запятые. Как это исправить? account.unformat () удаляет запятые, но я не уверен, к каким значениям применить их в функциях курсора. - person Darkstar; 24.12.2015
comment
Я понимаю что ты имеешь ввиду. Когда добавляется запятая, позиция курсора на один символ отстает от только что набранной цифры. Извините, мой совет был плохим. Фактически вам придется сохранять позицию курсора независимо от изменений форматирования, которые происходят слева и справа от курсора. Это потребует принципиально иного подхода к форматированию, чем тот, который используется в файле Accounting.js. Должен сказать, что это интересная алгоритмическая задача. - person Michael Laszlo; 24.12.2015
comment
Да, я не смог понять этого. - person Darkstar; 24.12.2015
comment
account.unformat удаляет все запятые и знаки валюты. Может быть, добавив это в функцию getCursorPosition, а затем подсчитав добавленные запятые и в зависимости от позиции курсора (например: сотни разрядов или 10 тысяч разрядов) добавить количество запятых, применимых к позиции курсора? - person Darkstar; 24.12.2015
comment
Да, вы можете сделать это, чтобы исправить вставку запятых. Он не распространяется на другие модификации, такие как обрезка пробелов и удаление лишних десятичных знаков. Решение общего назначения требует специального метода обработки строк, который сохраняет позицию курсора как свойство символа или как объект, подобный символу, отдельно. Это настолько интересный вопрос, что я могу написать об этом в блоге на этих выходных. - person Michael Laszlo; 24.12.2015
comment
Думаю, я пока оставлю это. Свяжите мне сообщение в блоге, когда закончите! - person Darkstar; 24.12.2015
comment
Я заметил еще кое-что странное: если вы набираете 9876.1, а затем вводите тире или символ, отличный от числа после 1, он удаляет 1 и десятичную дробь и округляет единичную цифру. Так что, если вы сделаете в конце символ .5 +, он изменится на 9877. - person Darkstar; 26.12.2015
comment
Вы когда-нибудь писали этот пост в блоге? - person Darkstar; 28.12.2015