web-dev-qa-db-ja.com

ExtJS NumberFieldの小数の表示を特定の精度に強制するにはどうすればよいですか?

JSONからタイプNumberFieldの値を取得するfloatのフォームがあります。値がたまたま整数の場合、小数点以下の桁数は表示されません。常に小数点第2位を表示したいと思います。このための構成オプションはありますか?

これが私の宣言です:

items: [
    { 
        fieldLabel: 'Net Sales',
        name: 'netSales',
        allowBlank:false,
        decimalPrecision:2
    },
14
Mike Sickler

いずれか拡張

var myNumberField = Ext.extend(Ext.form.NumberField, {
        setValue : function(v){
            v = typeof v == 'number' ? v : String(v).replace(this.decimalSeparator, ".");
            v = isNaN(v) ? '' : String(v).replace(".", this.decimalSeparator);
            //  if you want to ensure that the values being set on the field is also forced to the required number of decimal places.
            // (not extensively tested)
            // v = isNaN(v) ? '' : this.fixPrecision(String(v).replace(".", this.decimalSeparator));
            return Ext.form.NumberField.superclass.setValue.call(this, v);
        },
        fixPrecision : function(value){
            var nan = isNaN(value);
            if(!this.allowDecimals || this.decimalPrecision == -1 || nan || !value){
               return nan ? '' : value;
            }
            return parseFloat(value).toFixed(this.decimalPrecision);
        }
    });

...
...

items: [new myNumberField({
        id  : 'net',
        fieldLabel: 'Net Sales',
        allowBlank:false,
        decimalPrecision:2
    }),

またはoverride、これはアプリケーションのすべての数値フィールドに影響します。

Ext.override(Ext.form.NumberField, {
    setValue : function(v){
            v = typeof v == 'number' ? v : String(v).replace(this.decimalSeparator, ".");
        v = isNaN(v) ? '' : String(v).replace(".", this.decimalSeparator);
        return Ext.form.NumberField.superclass.setValue.call(this, v);
    },
    fixPrecision : function(value){
        var nan = isNaN(value);
        if(!this.allowDecimals || this.decimalPrecision == -1 || nan || !value){
           return nan ? '' : value;
        }
        return parseFloat(value).toFixed(this.decimalPrecision);
    }
})

items: [{
        xtype   : 'numberfield',
        fieldLabel: 'Net Sales',
        allowBlank:false,
        decimalPrecision:2
    },

[〜#〜]編集[〜#〜]

最初のsetValueメソッドのコメント付きセクションに注目してください。

9
Joshua

これはNumberFieldで小数を強制することに関する検索クエリの上位の結果だったので、ExtJS4 +を使用している人のためにこれを更新すると思いました

ExtJS 4がvalueToRaw関数に委任されてからの入力フィルタリングでは、使用されるsetValue関数は実際にはExt.form.field.Textからのものであるため、以下でオーバーライドします。

また、小数を表示するように強制することを、NumberFieldごとに構成可能なオプション(「forcePrecision」)にすることにしました。これは、オーバーライドが次のようになることを意味します。

Ext.override(Ext.form.NumberField, {
    forcePrecision : false,

    valueToRaw: function(value) {
        var me = this,
            decimalSeparator = me.decimalSeparator;
        value = me.parseValue(value);
        value = me.fixPrecision(value);
        value = Ext.isNumber(value) ? value : parseFloat(String(value).replace(decimalSeparator, '.'));
        if (isNaN(value))
        {
          value = '';
        } else {
          value = me.forcePrecision ? value.toFixed(me.decimalPrecision) : parseFloat(value);
          value = String(value).replace(".", decimalSeparator);
        }
        return value;
    }
});

これをフォームで使用するには、次のようにインスタンス化します。

{
  xtype: 'numberfield',
  name:  'decimalsfield',
  forcePrecision: true,     #defaults to false
  decimalPrecision: 3       #defaults to 2
}

インスタンス化されていないフィールド forcePrecision:true デフォルトとまったく同じように動作します。

14
Dave A

人気のある解決策は私にはうまくいきませんでした。実際、ソリューションのコードはEXT JS 3.3ソースコードの正確な複製であり、decimalPrecisionが2の場合、「1.00」ではなく「1」を表示します。setValueをオーバーライドするという一般的なソリューションの提案に基づいて、これがやった:

Ext.override(Ext.form.NumberField, {
    setValue: function(v) {
        var dp = this.decimalPrecision;
        if (dp < 0 || !this.allowDecimals) {
            dp = 0;
        }
        v = this.fixPrecision(v);
        v = Ext.isNumber(v) ? v : parseFloat(String(v).replace(this.decimalSeparator, "."));
        v = isNaN(v) ? '' : String(v.toFixed(dp)).replace(".", this.decimalSeparator);
        return Ext.form.NumberField.superclass.setValue.call(this, v);
    }
});

FixPrecisionコードは数値を目的の精度でフォーマットしているように見えますが、JavaScriptは、スーパークラスのsetValue関数を呼び出す前の2行での操作中に精度を失います。最終的に文字列に変換されるときにtoFixedで精度を設定すると、機能するようになりました。

幸運を!

11
Jens

おそらく、そのためのblurイベントにリスナーを追加してから、フィールドの値に対して組み込みのJavascript .toFixed(2)関数を使用することをお勧めします。

1
Jason

このコードは私にとって素晴らしい働きをします。 ExtJS4.2.0の「ValueToRow」オーバーライドなしでは機能しません。

var myNumberField = Ext.extend(Ext.form.NumberField, {
    setValue : function(v){
        v = typeof v == 'number' ? v : String(v).replace(this.decimalSeparator, ".");
        v = isNaN(v) ? '' : String(v).replace(".", this.decimalSeparator);
        return Ext.form.NumberField.superclass.setValue.call(this, v);
    },
    fixPrecision : function(value){
        var nan = isNaN(value);
        if(!this.allowDecimals || this.decimalPrecision == -1 || nan || !value){
        return nan ? '' : value;
        }
        var val = parseFloat(value).toFixed(this.decimalPrecision);
        return val;
    },
    valueToRaw: function(value) {
        var me = this,
        decimalSeparator = me.decimalSeparator;
        value = me.parseValue(value);
        value = me.fixPrecision(value);
        value = Ext.isNumber(value) ? value : parseFloat(String(value).replace(decimalSeparator, '.'));
        value = isNaN(value) ? '' : String(value).replace('.', decimalSeparator);
        return me.fixPrecision(value);
    }
});

...
...
items: [new myNumberField({
        id  : 'net',
        fieldLabel: 'Net Sales',
        allowBlank:false,
        decimalPrecision:2
    })

参照: Ext.form.field.Numberの末尾のゼロを保持する方法は?

0
Nuwa

オプションdecimalPrecisionの定義は次のとおりです。「小数点記号の後に表示する最大精度(デフォルトは2)」

フォーマットを強制するオプションはありません。おそらくNumberFieldクラスをオーバーライドする必要があります。

0
Davide Ungari

以下のようなものが必要な場合:

50を入力> uは50を取得しました

50.10> 50.10

50.123> 50.12

これを試して:

, setValue: function (v) {
      if ( !v || isNaN(v)) {
        v = '';
      }
      else if (v % 1 != 0) {    //means number is not whole number
        v = this.fixPrecision(String(v).replace(".", this.decimalSeparator));
      }

     return Ext.form.NumberField.superclass.setValue.call(this, v);
}
, fixPrecision: function (value) {
    if (!this.allowDecimals || this.decimalPrecision == -1) {
       return value;
    }

    return parseFloat(value).toFixed(this.decimalPrecision);
}
0
Umang