Handsontable 数字单元全球化

Posted

技术标签:

【中文标题】Handsontable 数字单元全球化【英文标题】:Handsontable numeric cell globalization 【发布时间】:2015-04-16 18:07:06 【问题描述】:

我对 js 比较陌生,现在必须在我们的项目中实现一个动手操作。 到目前为止,这运作良好,但我在全球化方面遇到了障碍。 基本上,我们使用逗号作为小数分隔符,但是当我尝试将“100,2”之类的内容复制到指定为“数字”的单元格中时,它将显示为 1002。 如果在指定为“文本”的单元格中输入相同的值,然后类型更改为数字,则该值将正确显示。 为此,我必须在表格源代码中添加“de”文化。(基本上复制“en”并更改当前与我相关的值。)

    numeral.language('de', 
    delimiters: 
        thousands: '.',
        decimal: ','
    ,//other non-relevant stuff here

当我直接从表中复制值并将它们插入到 np++ 时,它们显示为 100.2 等。但是,当将它们插入到 handsontable 中时,参数数组如下所示:

[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);

我希望我的问题已经足够清楚了,不确定我是否遗漏了什么。

是否有任何其他方法可以将正确的值返回到表中?这目前是不可能的吗?

提前致谢。

【问题讨论】:

【参考方案1】:

你问的不止一件事,但让我看看能不能帮你。

如handsontable numeric documentation 中所述,您可以定义单元格的格式。如果您想显示“100,2”,您可以按如下格式设置

format: '0.,'

您可以将其更改为您真正需要的,例如,如果您正在寻找金钱价值,您可以这样做

 format: '0,0.00 $'

你问的另一件事不是最新版本,但你可以看看它是如何工作的here

【讨论】:

感谢您的回答,我已经通过自定义验证方法解决了这个问题并发布了答案。您的解决方案也可以,但它并不能完全满足我目前对此的需求。【参考方案2】:

由于我们对表格的其他要求主要是向用户显示无效输入,因此我已经实现了自己的输入验证。

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 条记录,此代码的运行速度也相当快。 我在执行速度方面的主要障碍之一是我使用 handsontable .getDataAtCell.setDataAtCell 方法进行检查。这些似乎不能很好地处理大表(不是批评,只是观察)。已通过.getData 方法迭代数据来解决此问题。

【讨论】:

以上是关于Handsontable 数字单元全球化的主要内容,如果未能解决你的问题,请参考以下文章

Handsontable 和热公式解析器

如何将默认值 0 赋予 Handsontable 中的所有空单元格?

通过 Handsontable 使用特定格式显示数字

Handsontable - 输入验证,限制为包括小数点在内的数字

handsontable基础使用

HandsonTable 中的 \9 是啥?构建失败并出现语法错误