带有accounting.js格式的输入框,不允许我输入十进制数字

时间:2015-12-24 02:44:01

标签: javascript html formatting number-formatting

在我的网站satoshindex.com上,当我尝试在顶部输入框中键入带小数点的数字时,它会自动删除小数点。它也不允许我用Ctrl-A突出显示输入或使用箭头键移动到数字中的其他数字。

我认为这与accounting.js有关。

以下是我网站上的相关代码:

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

我知道它与btcConvertusdConvert函数中的这些行有关,因为当我删除它们时,问题就会消失,但不会使用逗号分隔数字。

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

我认为问题是每次输入输入框时都会调用btcConvert,而formatNumber正在删除小数位,但是btcConvert中没有formatNumber,当它高于999时,我无法使用逗号添加逗号,同样是美元兑换。

1 个答案:

答案 0 :(得分:2)

如果您确实快速键入1234.5或将其复制粘贴到输入字段中,您实际上可以输入像.5这样的十进制数字。在正常的打字速度下,1234.始终会变为1234,然后才能添加5。您怀疑,accounting.js正在将1234.简化为1234,因为这是它认为的规范格式。

因此,您希望用户可以键入1234.0并将其自动格式化为输入字段中的1,234.0。我看到了三种可能的方法:

  • 修改accounting.js代码。修改accounting.formatNumber,使其在input.value的最终字符时不会丢弃小数点。

  • 请勿使用accounting.js格式化输入字段。通过调用您自己编写的格式化函数,将调用替换为accounting.formatNumber

  • 一个快速而肮脏的解决方案:不要修改accounting.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,对于空{{1},它等于input.value.length - 1 }}