Handsontable - 我在 copying/pasting 一个德国数值时发现了一个错误
Handsontable - I found a bug when copying/pasting a german numeric value
我想在我的下一个项目中使用Javascript网格框架Handsontable,但是我发现了一个小错误,这是使用这个库的一个阻塞点。 :-(
我必须出示带有德国价格的 table,例如“18,50 欧元”。德语以 ,(逗号)作为小数点。默认情况下,handsontable 只有语言 "en" 用于嵌入式 "numeral.js" 帮助程序库。因此添加了 numeral.js 的德语 (de) 语言定义。单元格格式定义为“0.00 $”,它将在网格中正确显示为“18,50 €”。
但是当我 select 一个带有例如“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 版。
我尝试了很多方法来解决此错误(挂钩、自定义验证器等),但没有任何帮助,因为我没有在事件回调中获得原始值“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
我的想法是在 handsontable 更新单元格之前识别 1.50 并将其更改为 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 页面上与项目维护者讨论问题。
我想在我的下一个项目中使用Javascript网格框架Handsontable,但是我发现了一个小错误,这是使用这个库的一个阻塞点。 :-(
我必须出示带有德国价格的 table,例如“18,50 欧元”。德语以 ,(逗号)作为小数点。默认情况下,handsontable 只有语言 "en" 用于嵌入式 "numeral.js" 帮助程序库。因此添加了 numeral.js 的德语 (de) 语言定义。单元格格式定义为“0.00 $”,它将在网格中正确显示为“18,50 €”。
但是当我 select 一个带有例如“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 版。 我尝试了很多方法来解决此错误(挂钩、自定义验证器等),但没有任何帮助,因为我没有在事件回调中获得原始值“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
我的想法是在 handsontable 更新单元格之前识别 1.50 并将其更改为 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 页面上与项目维护者讨论问题。