diff --git a/demo/js/widget/numbereditor/demo.number_editor.js b/demo/js/widget/numbereditor/demo.number_editor.js
index c78238052..9a57706bd 100644
--- a/demo/js/widget/numbereditor/demo.number_editor.js
+++ b/demo/js/widget/numbereditor/demo.number_editor.js
@@ -7,7 +7,7 @@ Demo.FileManager = BI.inherit(BI.Widget, {
     },
 
     render: function () {
-        var editor = BI.createWidget({
+        var editor1 = BI.createWidget({
             type: "bi.number_editor",
             validationChecker: function (v) {
                 return BI.parseFloat(v) <= 100 && BI.parseFloat(v) >= 0;
@@ -16,21 +16,50 @@ Demo.FileManager = BI.inherit(BI.Widget, {
             width: 150,
             errorText: "hahah"
         });
-        editor.on(BI.NumberEditor.EVENT_CHANGE, function () {
+        editor1.on(BI.NumberEditor.EVENT_CHANGE, function () {
             if (BI.parseFloat(this.getValue()) < 1) {
-                editor.setDownEnable(false);
+                editor1.setDownEnable(false);
             } else {
-                editor.setDownEnable(true);
+                editor1.setDownEnable(true);
             }
-            BI.Msg.toast(editor.getValue());
+            BI.Msg.toast(editor1.getValue());
         });
+
+
+        var editor2 = BI.createWidget({
+            type: "bi.number_editor",
+            validationChecker: function (v) {
+                return BI.parseFloat(v) <= 100 && BI.parseFloat(v) >= 0;
+            },
+            valueFormatter: (v) => `${v}$`,
+            valueParser: (v) => v.replace(/\$\s?|(,*)/g, ''),
+            height: 24,
+            width: 150,
+            errorText: "hahah"
+        });
+        editor2.on(BI.NumberEditor.EVENT_CHANGE, function () {
+            if (BI.parseFloat(this.getValue()) < 1) {
+                editor2.setDownEnable(false);
+            } else {
+                editor2.setDownEnable(true);
+            }
+            BI.Msg.toast(editor2.getValue());
+        });
+
         return {
             type: "bi.vertical",
-            items: [{
-                el: editor,
-                height: 24
-            }]
+            hgap: 20,
+            vgap: 20,
+            items: [
+                {
+                    el: editor1,
+                    height: 24
+                }, {
+                    el: editor2,
+                    height: 24
+                }
+            ]
         };
     }
 });
-BI.shortcut("demo.number_editor", Demo.FileManager);
\ No newline at end of file
+BI.shortcut("demo.number_editor", Demo.FileManager);
diff --git a/src/base/single/button/button.basic.js b/src/base/single/button/button.basic.js
index 8fa304890..77bfd1036 100644
--- a/src/base/single/button/button.basic.js
+++ b/src/base/single/button/button.basic.js
@@ -26,6 +26,7 @@ BI.BasicButton = BI.inherit(BI.Single, {
             trigger: null,
             handler: BI.emptyFn,
             bubble: null,
+            debounce: true
         });
     },
 
@@ -222,10 +223,10 @@ BI.BasicButton = BI.inherit(BI.Single, {
         });
 
         // 之后的300ms点击无效
-        var onClick = BI.debounce(this._doClick, BI.EVENT_RESPONSE_TIME, {
+        var onClick = o.debounce ? BI.debounce(this._doClick, BI.EVENT_RESPONSE_TIME, {
             "leading": true,
             "trailing": false,
-        });
+        }) : this._doClick;
 
         function ev(e) {
             if (o.stopEvent) {
diff --git a/src/widget/numbereditor/number.editor.js b/src/widget/numbereditor/number.editor.js
index 596105947..69744f17d 100644
--- a/src/widget/numbereditor/number.editor.js
+++ b/src/widget/numbereditor/number.editor.js
@@ -10,6 +10,9 @@ BI.NumberEditor = BI.inherit(BI.Widget, {
             valueFormatter: function (v) {
                 return v;
             },
+            valueParser: function (v) {
+                return v;
+            },
             value: 0,
             allowBlank: false,
             errorText: "",
@@ -38,6 +41,10 @@ BI.NumberEditor = BI.inherit(BI.Widget, {
             errorText: o.errorText
         });
         this.editor.on(BI.TextEditor.EVENT_CHANGE, function () {
+            //  大多数时候valueFormatter往往需要配合valueParser一起使用
+            var value = this.getValue();
+            var parsedValue = o.valueParser(value);
+            this.setValue(o.valueFormatter(parsedValue));
             self.fireEvent(BI.NumberEditor.EVENT_CHANGE);
         });
         this.editor.on(BI.TextEditor.EVENT_ERROR, function () {
@@ -57,6 +64,7 @@ BI.NumberEditor = BI.inherit(BI.Widget, {
             type: "bi.icon_button",
             forceNotSelected: true,
             trigger: "lclick,",
+            debounce: false,
             cls: (o.simple ? "solid-triangle-top-font " : "add-up-font bi-border-left ") + "top-button bi-list-item-active2 icon-size-12"
         });
         this.topBtn.on(BI.IconButton.EVENT_CHANGE, function () {
@@ -68,6 +76,7 @@ BI.NumberEditor = BI.inherit(BI.Widget, {
             type: "bi.icon_button",
             trigger: "lclick,",
             forceNotSelected: true,
+            debounce: false,
             cls: (o.simple ? "solid-triangle-bottom-font " : "minus-down-font bi-border-left ") + "bottom-button bi-list-item-active2 icon-size-12"
         });
         this.bottomBtn.on(BI.IconButton.EVENT_CHANGE, function () {
@@ -154,4 +163,4 @@ BI.NumberEditor = BI.inherit(BI.Widget, {
 });
 BI.NumberEditor.EVENT_CONFIRM = "EVENT_CONFIRM";
 BI.NumberEditor.EVENT_CHANGE = "EVENT_CHANGE";
-BI.shortcut("bi.number_editor", BI.NumberEditor);
\ No newline at end of file
+BI.shortcut("bi.number_editor", BI.NumberEditor);