我对js相对较新,现在必须在我们的项目中实施一个动手。 到目前为止,这种方法运作良好,但我遇到了全球化的障碍 基本上,我们使用逗号作为小数分隔符,但是当我尝试复制类似" 100,2"进入指定为'数字的单元格,'它将显示为1002 如果在指定为' text'的单元格中输入相同的值然后将类型更改为数字,该值将正确显示 为此我已经不得不添加' de'文化到表源代码。(基本上复制' en'并更改当前与我相关的值。)
numeral.language('de', {
delimiters: {
thousands: '.',
decimal: ','
},//other non-relevant stuff here
当我直接从表中复制值并将它们插入到np ++时,它们显示为100.2等。但是,当将它们插入到handsontable时,arguments-array看起来如下:
[Array[1], "paste", undefined, undefined, undefined, undefined]
0: Array[4]
0: 1 //row
1: 1 //column
2: "100.2" //previous value
3: 1002 //new value
这是我目前所尝试的内容:
hot.addHook("beforeChange", function () {
if (arguments[1] === "paste") {
hot.updateSettings({
cells: function (row, col, prop) {
var cellProperties = {
type: 'numeric',
language: 'en'
};
return cellProperties;
}
});
//hot.updateSettings({
// cells: function (row, col, prop) {
// var cellProperties = {
// type: 'text',
// };
// return cellProperties;
// }
//});
}
}, hot);
hot.addHook("afterChange", function () {
if (arguments[1] === "paste") {
ChangeMatrixSettings(); //reset cell properties of whole table
}
}, hot);
我希望我的问题足够清楚,不确定我是否错过了什么。
还有其他方法可以将正确的值重新放回到表中吗?这目前不可能吗?
提前致谢。
答案 0 :(得分:0)
你问了不止一件事,但让我看看能否帮到你。
如handsontable numeric documentation中所述,您可以定义单元格的格式。如果您希望显示“100,2”,则格式如下
format: '0.,'
您可以将其更改为您真正需要的内容,例如,如果您正在寻找金钱价值,您可以执行类似
的操作 format: '0,0.00 $'
您询问的另一件事不是最新版本,但您可以查看它是如何工作的here
答案 1 :(得分:0)
我已经实现了自己的输入验证,因为我们对表的其他要求主要是关于向用户显示无效输入。
function validateInputForNumeric(parameter) {
var value = parameter[3];
var row = parameter[0];
var col = parameter[1];
if (decimalSeperator === '') {
var tmpculture = getCurrCulture();
}
if (value !== null && value !== "") {
if (!value.match('([a-zA-Z])')) {
if (value.indexOf(thousandSeperator) !== -1) {
value = removeAndReplaceLast(value, thousandSeperator, ''); //Thousandseperators will be ignored
}
if (value.indexOf('.') !== -1 && decimalSeperator !== '.') {
//Since numeric variables are handled as '12.3' this will customize the variables to fit with the current culture
value = removeAndReplaceLast(value, '.', decimalSeperator);
}
//Add decimalseperator if string does not contain one
if (numDecimalPlaces > 0 && value.indexOf(decimalSeperator) === -1) {
value += decimalSeperator;
}
var index = value.indexOf(decimalSeperator)
var zerosToAdd = numDecimalPlaces - (value.length - index - 1);
for (var j = 0; j < zerosToAdd; j++) {
//Add zeros until numberOfDecimalPlaces is matched for uniformity in display values
value += '0';
}
if (index !== -1) {
if (numDecimalPlaces === 0) {
//Remove decimalseperator when there are no decimal places
value = value.substring(0, index)
} else {
//Cut values that have to many decimalplaces
value = value.substring(0, index + 1 + numDecimalPlaces);
}
}
if (ErrorsInTable.indexOf([row, col]) !== -1) {
RemoveCellFromErrorList(row, col);
}
} else {
AddCellToErrorList(row, col);
}
}
//console.log("r:" + row + " c:" + col + " v:" + value);
return value;
}
inputParameter是一个数组,因为使用数组进行编辑事件的交互式挂钩。 parameter[2]
是旧值,如果在任何时候都需要它。
即使从Excel(2s-4s)复制2k记录,此代码的工作速度也相当快。
关于执行速度的主要障碍之一是我使用handontable .getDataAtCell
和.setDataAtCell
方法来检查。这些似乎并不能很好地处理大表(不是批评,只是观察)。通过.getData
方法迭代数据来解决这个问题。