TextBox文本框允许用户输入正或负小数

按项目要求,
2个TextBox文本框,一个只接受正小数,另一个可以接受正或负小数。
因此,程序可控制在修改或新输入时,输入的数据符合要求。

2026-03-04_09-29-48


<asp:TemplateField>
    <HeaderStyle BorderColor="#c0c0c0" BorderWidth="1" />
    <ItemStyle BorderColor="#c0c0c0" BorderWidth="1" BackColor="White" />
    <HeaderTemplate>
        标准值          <%--只接受正小数--%>              
    </HeaderTemplate>
    <ItemTemplate>
        <asp:TextBox ID="TextBoxBiaoZhunZh" runat="server" Text='<%# Eval("BiaoZhunZhi") %>'
            CssClass="number-input"
            data-allow-negative="false"
            oninput="validateNumber(this)"
            onkeydown="return allowNumberKeys(this, event)"></asp:TextBox>
    </ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
    <HeaderStyle BorderColor="#c0c0c0" BorderWidth="1" />
    <ItemStyle BorderColor="#c0c0c0" BorderWidth="1" BackColor="White" />
    <HeaderTemplate>
        替代公差      <%--接受正或负小数--%>                
    </HeaderTemplate>
    <ItemTemplate>
        <asp:TextBox ID="TextBoxTiDaiGongChai" runat="server" Text='<%# Eval("TiDaiGongChai") %>'
            CssClass="number-input"
            data-allow-negative="true"
            oninput="validateNumber(this)"
            onkeydown="return allowNumberKeys(this, event)"></asp:TextBox>
    </ItemTemplate>
</asp:TemplateField>
View Code

 

Insus.NET刚开始按下面代码来实现的,
验证整数,
onkeyup="value=value.replace(/[^\d]/g,'')"
                                    onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"


验证小数,

onkeyup="value=value.replace(/[^-?\d\.]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^-?\d\.]/g,''))"

 

这样写法,会有问题,用户可以输入多个负符号或多个小数点。

只有写javascript来实现,
2026-03-04_09-42-55

 var lastValidValueKey = 'data-last-valid';

 // 初始化所有数字输入框
 function initNumberInputs() {
     var inputs = document.querySelectorAll('.number-input');
     for (var i = 0; i < inputs.length; i++) {
         var input = inputs[i];
         input.setAttribute(lastValidValueKey, input.value);
     }
 }

 // 验证输入并更新合法值
 function validateNumber(input) {
     var value = input.value;
     // 根据 data-allow-negative 选择正则
     var allowNegative = input.getAttribute('data-allow-negative') === 'true';
     var pattern;
     if (allowNegative) {
         // 允许正负小数:可选的负号,后面跟数字和小数点(最多一个小数点)
         pattern = /^-?(?:\d+\.?\d*|\.\d+)?$/;
     } else {
         // 只允许非负小数:只能有数字和一个小数点,不能有负号
         pattern = /^\d*\.?\d*$/;
     }

     if (pattern.test(value)) {
         input.setAttribute(lastValidValueKey, value);
     } else {
         var lastValid = input.getAttribute(lastValidValueKey);
         if (lastValid !== null) {
             input.value = lastValid;
         } else {
             input.value = '';
         }
     }
 }

 // 按键过滤(根据是否允许负号动态允许/禁止负号键)
 function allowNumberKeys(input, e) {
     var key = e.key;
     // 始终允许功能键(退格、删除、箭头等)
     if (key.length > 1) {
         return true;
     }
     // 允许数字和小数点
     if (/[\d\.]/.test(key)) {
         return true;
     }
     // 如果允许负号,且按键是负号,则允许
     var allowNegative = input.getAttribute('data-allow-negative') === 'true';
     if (allowNegative && key === '-') {
         return true;
     }
     // 其他按键(如字母)禁止
     return false;
 }

 // 页面加载完成后初始化
 if (document.readyState === 'loading') {
     document.addEventListener('DOMContentLoaded', initNumberInputs);
 } else {
     initNumberInputs();
 }
View Code

 




posted @ 2026-03-04 09:56  Insus.NET  阅读(2)  评论(0)    收藏  举报