Javascript Handsontable-我在复制/粘贴德语数值时发现了一个错误

Javascript Handsontable-我在复制/粘贴德语数值时发现了一个错误,javascript,handsontable,Javascript,Handsontable,我想在下一个项目中使用Javascript网格框架Handsontable,但我发现了一个小错误,这是使用此库的一个障碍点:-( 我必须显示一个带有德语价格的表,例如“18,50€”。德语有一个(逗号)作为小数点。默认情况下,handsontable只有嵌入式“numeric.js”助手库的语言“en”。因此,为numeric.js添加了德语(de)语言定义。单元格格式定义为“0.00$”,它将正确显示为网格中的“18,50欧元” 但是,当我选择一个单元格时,例如“1,50€”(单击该单元格),

我想在下一个项目中使用Javascript网格框架Handsontable,但我发现了一个小错误,这是使用此库的一个障碍点:-(

我必须显示一个带有德语价格的表,例如“18,50€”。德语有一个(逗号)作为小数点。默认情况下,handsontable只有嵌入式“numeric.js”助手库的语言“en”。因此,为numeric.js添加了德语(de)语言定义。单元格格式定义为“0.00$”,它将正确显示为网格中的“18,50欧元”

但是,当我选择一个单元格时,例如“1,50€”(单击该单元格),然后按“Ctrl+C”并用Ctrl+V再次将其粘贴到另一个单元格中。新单元格的值“15,00€”错误,因为剪贴板中复制的值为“1.5”,然后将粘贴为“15”

HTML:

我创建了一个JSFIDLE来演示这个问题:

我使用的是0.23.0版。 我尝试了很多方法来解决这个错误(钩子、自定义验证器等等),但是没有任何帮助,因为我没有在事件回调中得到原始值“1.5”。我只得到了错误的值“15”。 当使用“beforeChange”钩子作为handsontable构造函数中的附加选项时,可以看到这一点:

beforeChange: function (changes, source) {
        for (var i = changes.length - 1; i >= 0; i--) {
            console.log('Changes: source:' + source + ' row:' + changes[i][0] + ' col:' + changes[i][1] + ' old:' + changes[i][2] + ' new:' + changes[i][3]);
        }
    }
当我复制并粘贴“1,50€”时,控制台显示:

Changes: source:paste row:1 col:0 old:null new:15
我的想法是在handsontable更新单元格之前识别1.50并将其更改为1.50,但新值已经是“15”,因此没有机会看到原始复制值:-(

也许你们当中有人有个主意

提前谢谢

更新: 在源代码中,我找到了函数“validateChanges”,它执行以下操作:

if (numeral.validate(changes[i][3])) {
    changes[i][3] = numeral().unformat(changes[i][3]);
}
当当前的数字语言是“de”并将其称为“15”时,结果是“15”。因此,问题出在这里,但如何解决它呢

numeral().unformat('1.5 €')
现在我明白了,为什么调用钩子“beforeChange”时没有得到原始复制值,因为这个“validateChanges”是在钩子触发之前调用的

现在呢?

在第24646行替换:

if (languages[currentLanguage].delimiters.decimal !== '.') {
  string = string.replace(/\./g, '').replace(languages[currentLanguage].delimiters.decimal, '.');
}
为此:

if (languages[currentLanguage].delimiters.decimal !== '.') {
  string = string.replace(languages[currentLanguage].delimiters.decimal, '.');
}
第一个字符串replace从原始数据中删除小数点

注意:我对这个js库不太熟悉,这可能会导致意外后果。在github页面上与项目维护人员讨论这个问题。

第24646行替换:

if (languages[currentLanguage].delimiters.decimal !== '.') {
  string = string.replace(/\./g, '').replace(languages[currentLanguage].delimiters.decimal, '.');
}
为此:

if (languages[currentLanguage].delimiters.decimal !== '.') {
  string = string.replace(languages[currentLanguage].delimiters.decimal, '.');
}
第一个字符串replace从原始数据中删除小数点


注意:我对这个js库不太熟悉,这可能会导致意外的后果。请在github页面上与项目维护人员讨论这个问题。

这个技巧非常有效,但它意味着要在第三方库中进行更改。即使这个修复程序是handsontable库使用的嵌入式digital.js库中的修复程序。因此我必须首先与numeric.js库的维护人员讨论此修复,然后要求handsontable维护人员在他们的handsontable.full.js中嵌入一个新版本的numeric.js。我不会将此称为修复,它只是您项目的一个变通方法。此破解非常有效,但它意味着在第三方库中进行更改。即使此修复也是embedded Digital.js库是handsontable库使用的。因此我必须首先与Digital.js库的维护人员讨论这个修复,然后让handsontable维护人员在他们的handsontable.full.js中嵌入一个新版本的digital.js。我不会称之为修复,这只是您项目的一个变通方法。