更改前清理输入

时间:2018-07-03 09:47:38

标签: javascript jquery handsontable

我正在使用带浮点数的handsontable 0.35.1。目的是允许用户从电子表格(和在excel中打开的csvs)复制粘贴。问题是,它带有一些我需要摆脱的垃圾。未正确验证输入的一些示例如下:

1,000.00
USD 100.00
'10000.00  '  //note there are trailing spaces

我想找到一种在输入之前就可以操纵输入的方法。到目前为止,我发现的唯一方法是使用beforeChange,但是问题是验证。系统更改了输入,但似乎已经进行了验证。如果我模糊并再次模糊,则可以。

这里是fiddle。重现步骤:输入数字a123-应将其更正为123并验证为正确的数字。

我尝试使用beforeValidation代替,但是它并没有按照我的预期工作。

2 个答案:

答案 0 :(得分:1)

我更新了示例https://jsfiddle.net/fma4uge8/29/,该示例可以全部实现1种功能。

function trimFloat(value) {
    return value.trim().replace(/[^0-9\.\-\+]/g, '');
}

options = {
  columns: [
    { type: 'date' },
    { type: 'numeric', numericFormat: {pattern: '0,0.00'}, trimWhitespace: true }
  ],
  colHeaders: ["Date", "Float"],
  beforeChange: function(changes, source){
    let that = this;
    _.each(changes, function(change){
      if (_.isString(change[3])) {
            let value = trimFloat(change[3]);
          //prevent endless loop
          if (value !== change[3]) {
            change[3] = trimFloat(change[3]);
                        that.setDataAtCell(change[0], change[1], change[3]);       
          }
      }
    })
  }
}
$('#hot-sheet').handsontable(options)

答案 1 :(得分:1)

您可以使用beforePaste回调来清理输入

  options = {
    columns: [
      { type: 'date' },
      { type: 'numeric', numericFormat: {pattern: '0,0.00'} }
  ],
  colHeaders: ["Date", "Float"],
  beforePaste: (data, coords) => {
    data.forEach((col, colIndex) => {
        col.forEach((row, rowIndex) => {
        let value = row.trim().replace(/[^0-9\.\-\+]/g, '')
        data[colIndex][rowIndex] = value
      })
    })
    return true
  },
}
$('#hot-sheet').handsontable(options)

这是小提琴https://jsfiddle.net/xpvt214o/348195/

注意:您无法创建新的数据数组,必须更新数据数组而不是创建新的数据数组。