【问题标题】:Replacing if the first number is a zero and the number is greater than 2 places如果第一个数字为零并且该数字大于 2 位,则替换
【发布时间】:2015-08-28 18:03:25
【问题描述】:

我正在使用一个计算器,但遇到了问题。为了防止用户无法将字段留空,如果该字段留空,我将强制为零。没关系,但问题是当字段中的文本被删除以删除零并输入新数字时,它会自动输入零,所以我的新数字如下所示:05

如果数字中有两个以上的位置并且第一个数字为零,我如何运行替换,替换零?这是我用于计算器的代码。

$(function(){

  calculate();

$('.input').keypress(function (e) {
     //if the letter is not digit then display error and don't type anything
     if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
               return false;
    }
   });

  $('.input').on('keyup',function(){
    if($(this).val()==''){
      $(this).val('0');
    }
    calculate();
  });

});

function calculate(){

  var d6 = parseFloat(($('#d6').val()).replace(/,/g,''));
  var d20 = parseFloat(($('#d20').val()).replace(/,/g,''));
  var b20 = d6;
  var e20 = parseFloat(($('#e20').val()).replace(/,/g,''));

  var f20 = d20*e20;
  var f22 = b20/f20;
  var f23 = (52-f22)*f20;

  $('#f20').html(formatCurrency(f20));
  $('#f22').html(f22.toFixed(2));
  $('#f23').html(formatCurrency(f23));

}

function formatCurrency(x) {
    return '$'+x.toString().replace(/\B(?=(?:\d{3})+(?!\d))/g, ",");
}

【问题讨论】:

  • if(str.length > 1 && str[0] == "0") { str=str.substring(1,str.length) }
  • @juvian 我认为第二次检查是不必要的。根据他所说,0 总是在前面。
  • @Onilol 如果您检查代码,他会将 '' 更改为 '0',所以一段时间后 .val() 将是 '12',没有 0
  • OP,您是在使用 html 表单还是...?

标签: javascript jquery


【解决方案1】:

如果您实际上是想将其转换为格式化数字,则可以尝试输入强制:

'' + new Number('')       // "0"
'' + new Number('0')      // "0"
'' + new Number('05')     // "5"
'' + new Number('0000.2') // "0.2"

【讨论】:

    【解决方案2】:

    更改归零代码以使用 blur() 事件,即当字段失去焦点时。

    $('.input').blur(function(){
    if($(this).val()=='') { $(this).val('0'); } });

    【讨论】:

    • 我觉得他问的不是这个。
    • 这应该可以解决他的问题,因为当用户输入一个空字段时,keyup 事件将输入一个零
    【解决方案3】:

    我假设按退格键会删除文本。

    如果是这种情况,那么当您退格为零时,您的 keyup 处理程序将触发,这将检测到没有输入,然后添加零。

    【讨论】:

    • 或者它可以突出显示并替换为另一个键。
    • 无论哪种方式,它都会通过处理程序添加一个意外的零。
    • 我认为它们是不同的东西,@PhilipRead。正如您所说,keyup 上的退格不会检测到输入,但突出显示并用另一个值替换会检测到输入。
    • 确实如此。真的没想到。
    【解决方案4】:

    首先,你做得很艰难。试试这个……如果用户点击输入,那么它将被清除,用户可以写任何他想要的数字……

    $( ".input" ).focus(function() {
      (this).val('');
    });
    

    【讨论】:

      【解决方案5】:

      也许这样就可以了。

      $('.input').on('keyup',function(){
              if($(this).val()=='' && $(this).val().substring(0,2) === ' ' || '') {
               $(this).val('0');
              }
              calculate();
            });
      
          });
      

      【讨论】:

        【解决方案6】:

        如果您使用的是 HTML5 表单,则可以避免使用如下代码:

        <input type="number" placeholder="Type a number" required>
        

        必需的属性是布尔属性。

        如果存在,它指定必须填写输入字段。

        【讨论】:

          【解决方案7】:

          不要使用 keyup 和 keypress 事件来检查空白并将其替换为零,而是使用 change 事件。

          $(function(){
          
            calculate();
          
          $('.input').keypress(function (e) {
               //if the letter is not digit then display error and don't type anything
               if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
                         return false;
              }
             });
          
            $('.input').on('keyup',function(){
              calculate();
            });
          
          $('.input').on('change',function(){
              if($(this).val()==''){
                $(this).val('0');
              }
            });
          
          });
          
          function calculate(){
          var d6Val = ($('#d6').val() !== "")? $('#d6').val() : '0';
          var d20Val = ($('#d20').val() !== "")? $('#d20').val() : '0';
          var e20Val = ($('#e20').val() !== "")? $('#e20').val() : '0';
            var d6 = parseFloat((d6Val).replace(/,/g,''));
            var d20 = parseFloat((d20Val).replace(/,/g,''));
            var b20 = d6;
            var e20 = parseFloat((e20Val).replace(/,/g,''));
          
            var f20 = d20*e20;
            var f22 = b20/f20;
            var f23 = (52-f22)*f20;
          
            $('#f20').html(formatCurrency(f20));
            $('#f22').html(f22.toFixed(2));
            $('#f23').html(formatCurrency(f23));
          
          }
          
          function formatCurrency(x) {
              return '$'+x.toString().replace(/\B(?=(?:\d{3})+(?!\d))/g, ",");
          }
          

          还有一件事。仅当您从该输入移开焦点时才会触发更改事件。

          如果您遇到任何问题,请告诉我。

          【讨论】:

          • 这确实有效。没想到这样做。谢谢!
          • 刚刚意识到这实际上破坏了计算器,因为它现在不是实时计算。我现在必须更改到另一个字段才能获得结果。还有其他想法吗?
          • Damien 你在使用 html 表单吗?
          • 试试这个:'' + new Number($(this).val())
          • 嘿,Damien,您能分享一下 HTML 结构,以便我可以使用您的代码并进行一些测试。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-13
          • 1970-01-01
          • 2016-11-14
          • 1970-01-01
          • 1970-01-01
          • 2023-03-17
          相关资源
          最近更新 更多