簡體   English   中英

Handsontable - 我在復制/粘貼德語數值時發現了一個錯誤

[英]Handsontable - I found a bug when copying/pasting a german numeric value

我想在我的下一個項目中使用Javascript網格框架Handsontable,但我發現了一個小bug,這是使用這個lib的阻塞點。 :-(

我必須顯示一張德國價格表,例如“ 18,50€”。 德語以小數點(,)表示。 默認情況下,handsontable僅對嵌入式“ numeral.js”幫助程序庫使用語言“ en”。 因此,為numeric.js添加了德語(de)語言定義。 單元格格式定義為“0.00 $”,它將在網格中正確顯示為“18,50€”。

但是當我選擇一個例如“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。 我嘗試了很多來解決這個bug(鈎子,自定義驗證器......),但沒有任何幫助,因為我沒有在事件回調中得到原始值“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

我的想法是識別1.50並在handontable更新單元格之前將其更改為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頁面上與項目維護者討論問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM