繁体   English   中英

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

[英]Handsontable - I found a bug when copying/pasting a german numeric value

我想在我的下一个项目中使用Javascript网格框架Handsontable,但我发现了一个小bug,这是使用这个lib的阻塞点。 :-(

我必须显示一张德国价格表,例如“ 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。 我尝试了很多来解决这个bug(钩子,自定义验证器......),但没有任何帮助,因为我没有在事件回调中得到原始值“1.5”。 我只得到错误的值“15”。 当在handsontable构造函数中使用“ beforeChange”钩子作为附加选项时,您可以看到以下内容:

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

我的想法是识别1.50并在handontable更新单元格之前将其更改为1,50,但新值已经是“15”,因此没有机会看到原始复制的值。 :-(

也许你们中的某个人有一个想法。

提前致谢。

更新:

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

if (numeral.validate(changes[i][3])) {
    changes[i][3] = numeral().unformat(changes[i][3]);
}

当当前数字语言为'de'并将其命名为“ 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, '.');
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM