1

ExtJS 4.1を使用していて、通貨フィールドを値/ 1000として表示しようとしていますが、表示されているだけです。たとえば、ユーザーが1234.56と入力した場合、画面には1,234.56と表示されますが、画面に表示されている場合に限ります。それ以外の場合は、1234560として格納されます。その数値の背後にあるすべての計算では1234560として扱われます。私はbigintをストアとして使用していますが、私の国では20億が正規数であるため、浮動小数点数は避けたいと思います。小数部が必要です。

どうやってそれができる?

ありがとうございました。

4

2 に答える 2

1

1つの方法は、ベーステキストボックスを拡張する新しいコンポーネントを作成し、それにstoredValueのような名前のプロパティを追加し、フォーカスイベントとブラーイベントのハンドラーを登録して、保存された値を表示/編集用の10進値に変換してからコンマ形式のバージョンで、格納されている値を整数値で更新しました。

編集

仕事に戻ったばかりで、この古いコードスニペットが役立つかもしれないと考えました。しばらく前に自分で作成した通貨フィールドです。親フォームのリスナーは、更新前/更新後のイベントがあるフォームの拡張バージョンでのみ機能します。アプリケーションで必要に応じてgetValue、getSubmitValue、およびgetSubmitData関数をオーバーロードするなど、これを行うためのより良い方法がおそらくあります。私の必要性は、通貨記号とコンマを表示することだけだったので、必要に応じて変更する必要がありますが、まだ遠くないか、問題が発生している場合は、適切な開始点を提供する必要があります。幸運を。

Ext.define('Ext.ux.form.field.Currency', {
    extend: 'Ext.form.field.Text',

    alias: 'widget.currencyfield',

    initComponent: function (config) {
        this.callParent(arguments);
    },

    hasFocus: false,

    listeners: {
        render: function () {
            var form = this.findParentByType('form');

            form.on('afterLoadRecord', function () {
                this.toRaw();
                if (this.getRawValue() == 0) {
                    this.setRawValue('');
                } else {
                    this.toFormatted();
                }
            }, this);

            form.on('beforeUpdateRecord', function () {
                this.toRaw();
            }, this);

            form.on('afterUpdateRecord', function () {
                this.toRaw();
                if (this.getRawValue() == 0) {
                    this.setRawValue('');
                } else {
                    this.toFormatted();
                }
            }, this);
        },
        focus: function (field, e, eOpts) {
            this.toRaw();
            this.hasFocus = true;
        },
        blur: function (field, e, eOpts) {
            //Clear out commas and $
            this.toRaw();

            //If there's a value, format it
            if(field.getValue() != '') {
                this.toFormatted();
                this.hasFocus = false;
            }
        }
    },

    stripAlpha: function (value) {
        return value.replace(/[^0-9.]/g, '');
    },

    toRaw: function () {
        if (this.readOnly !== true) {
            this.setRawValue(this.stripAlpha(this.getRawValue()));
        }
    },

    toFormatted: function () {
        this.setRawValue(Ext.util.Format.currency(this.getRawValue(), '$ ', 0));
    },

    getValue: function () {
        return parseFloat(this.stripAlpha(this.getRawValue()));
    }
});
于 2013-01-02T06:08:50.240 に答える
0

遊んだ後、モデルに基づいた別の解決策があります。price_displayなどの存在しないフィールドを作成し、それを使用して表示します。

Ext.define('app.model.PriceSample', {
  extend: 'Ext.data.Model',
  field: [
    {name: 'price', type: 'int'},
    {name: 'price_display', type: 'float', convert: function (value, records) {
      if (value) { //on write
        record.set('price', value * 1000);
        return value;
      } else {
        return record.get('price') / 1000;
      }
    }}
  ]
}

グリッドやコンボなどでは、priceの代わりにprice_displayを使用します。ただし、計算を実行する場合は、価格を使用します。

于 2013-01-03T16:55:32.417 に答える