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

标签 javascript handsontable

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

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

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

HTML:

<div id="exampleGrid"></div>

Javascript:

(function () {
    var language = {
        delimiters: {
            thousands: '.',
            decimal: ','
        },
        abbreviations: {
            thousand: 'k',
            million: 'm',
            billion: 'b',
            trillion: 't'
        },
        ordinal: function (number) {
            return '.';
        },
        currency: {
            symbol: '€'
        }
    };
    if (typeof window !== 'undefined' && this.numeral && this.numeral.language)  {
        this.numeral.language('de', language);
    }
}());

$("#exampleGrid").handsontable({
    data: [ [1.5], [] ],
    rowHeaders: true,
    colHeaders: true,
    columns: [
        { type: 'numeric', format: '0.00 $', language: 'de'}
    ]
});

我创建了一个jsfiddle来演示这个问题:http://jsfiddle.net/hU6Kz/4873/

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

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]);
}

当前数字语言为“德”时调用此函数,结果为“15”。那么问题来了,但是如何解决呢?

numeral().unformat('1.5 €')

现在我明白了,为什么当调用“beforeChange”钩子(Hook)时我没有获得原始复制值。因为这个“validateChanges”是在触发钩子(Hook)之前调用的。

现在呢?

最佳答案

替换第 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, '.');
}

第一个字符串替换从原始数据中删除小数点。

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

关于javascript - Handsontable - 我在复制/粘贴德语数值时发现了一个错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35960723/

相关文章:

javascript - HandsOnTable - 显示单元格的工具提示

javascript - IE 中的手感宽度和高度

javascript - 单击事件更改图像源并添加像素

javascript - 我可以使用提交按钮和JS提交表单吗?

javascript - 如何通过ajax将php插入jquery追加?

javascript - Handsontable - 更改行高

javascript - rhandsontable 具有行突出显示和复选框列

当 HOT div 高度为 100% 时,Handsontable 滚动问题

javascript - 如何正确地将输入元素的值渲染到 div 中?

javascript - 在 PC 和移动浏览器中运行的隐藏和显示切换