accounting.js 格式的输入框不允许我输入小数

Input box with accounting.js formatting not letting me input decimal numbers

在我的网站 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,美元兑换相同。

如果您非常快速地键入 .5 或者如果您将其复制粘贴到输入字段中,您实际上可以输入像 1234.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 将始终 return -1,等于 input.value.length - 1 为空 input.value.