掌控数字小区全球化

时间:2015-02-16 09:08:40

标签: globalization handsontable

我对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);

我希望我的问题足够清楚,不确定我是否错过了什么。

还有其他方法可以将正确的值重新放回到表中吗?这目前不可能吗?

提前致谢。

2 个答案:

答案 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方法迭代数据来解决这个问题。