2013-06-18 4 views
1

У меня есть поле ввода, которое для платежей, и я хочу, чтобы только номер, как x.xx, конечно xxxx.x будет работать или хххххJQuery KeyDown только цифры

у меня есть настройки довольно много работает минус какое-то странное поведение. если числа 1 и 2 после десятичного разряда могут быть 2 цифры длинными (работает), но если я нажимаю 3-9, то он разрешает только одну цифру. также 0 вправо от десятичного числа допускаются бесконечно.

heres what im working with. Также я хочу, чтобы только когда кнопку, и введите ее нажатой затем запустить функцию

$('#money-button-input-box').keydown(function(event) { 
    var str = $(this).val() 

    if(str.length >= 1){ 
     var rightHalf = str.split('.')[1]; 
     if(rightHalf >= 3 && event.keyCode != 8){ 
      event.preventDefault(); 
     } 
    } 

    if((event.keyCode == 190 || event.keyCode == 110) && str.replace(/[^.]/g, "").length >= 1){ 
     event.preventDefault(); 
    } 
    allowOnlyNumbers(event); 

    if (event.keyCode == 13) { 
     if($(this).val() == '')return; 
     enterPayment($(this)); 
    } 
}); 

и функцию

function allowOnlyNumbers(events){ 
    // Allow: backspace, delete, tab, escape, and enter 
    if (events.keyCode == 46 || events.keyCode == 8 || events.keyCode == 9 || events.keyCode == 27 || events.keyCode == 13 || 
    // allow decimals 
    events.keyCode == 190 || events.keyCode == 110 || 
    // Allow: Ctrl+A 
    (events.keyCode == 65 && events.ctrlKey === true) || 
    // Allow: home, end, left, right 
    (events.keyCode >= 35 && events.keyCode <= 39)) { 
    // let it happen, don't do anything 
     return; 
    } else { 
     // Ensure that it is a number and stop the keypress 
     if (events.shiftKey || (events.keyCode < 48 || events.keyCode > 57) && (events.keyCode < 96 || events.keyCode > 105)) { 
      events.preventDefault(); 
     } 
    } 
} 

http://jsfiddle.net/Qxtnd/

ответ

0

Проблема знаков после запятой, потому что вы используете

rightHalf >= 3 

который вычисляет действительное количество & не его длина, потому что тип javascript приводит его к числу для сравнения. То, что вы хотите, вместо того, чтобы это количество цифр, попробуйте

rightHalf.toString().length >= 2 

скрипку здесь http://jsfiddle.net/Qxtnd/1/

Редактировать

Пока rightHalf является строка, которую вы можете сделать:

rightHalf.length >= 2 

если правыйHalf - это номер, который вы получите за это исключение.

+1

Ну так это строка вы можете оставить из .ToString() она является тип литья ряда – Precastic

+0

rightHalf не нужна функция ToString, потому что это была строка. –

+0

все работает отлично. я также удалил tostring, как сказал другие – seesoe

0
function isNumberKeyUp(event, obj, beforeLength, afterLength) { 
    var text = document.getElementById(obj).value; 
    var splitText = text.split('.'); 
    if (splitText.length > 1 && splitText[1].length > afterLength) { 
     document.getElementById(obj).value = splitText[0] + "." + splitText[1].substring(0,2); 
     return false; 
    } 
    return true; 
} 

function isNumberKey(event, obj,beforeLength,afterLength) { 
    var keyCode1 = event.keyCode; 

    var keyCode = 0; 
    if (keyCode1 == 0) 
     keyCode = event.which; 
    else { 
     keyCode = keyCode1; 
    } 

    if ((keyCode >= 48 && keyCode <= 57) || keyCode == 46 || keyCode == 13 || keyCode == 27 || keyCode == 127) { 
     var text = document.getElementById(obj).value; 
     if (keyCode == 46 && keyCode1 == 0) { 
      if (text.toString().indexOf(".") != -1) { 
       return false; 
      } 
     } 
     if (keyCode == 46) { 
      if (text.toString().indexOf(".") != -1) { 
       return false; 
      } 
     } 

     var splitText = text.split('.'); 
     if (splitText[0].length >= beforeLength) { 
      if (keyCode == 46 && text.toString().indexOf(".") == -1) { 
       return true; 
      } else if (text.toString().indexOf(".") != -1) 
      { 
       return true; 
      } 
      return false; 
     } 
    } 
    else { 
     return GetDefault(event); 
    } 
    return true; 
} 

function GetDefault(event) { 
    var keyCode = event.keyCode; 
    if (keyCode == 0) 
     keyCode = event.which; 

    if (keyCode == 8 || keyCode == 9 || keyCode == 35 || keyCode == 36 || keyCode == 37 || keyCode == 38 || keyCode == 39 || keyCode == 40 || keyCode == 46 || keyCode == 118) { 
     return true; 
    } 
    return false; 
} 

Ниже HTML называть это события

<input type="text" onkeyup="return isNumberKeyUp(event,'txtID',9,2);" onkeypress="return isNumberKey(event,'txtID',9,2);" required="required" id="txtID" maxlength="12" value="1.00" name="txtID"> 
-1
$('#money-button-input-box').keyup(function() { 
     $(this).val(FormatNumber($(this).val())); 

    }); 

function FormatNumber(val){ 
    var split = val.split('.'); 
    if (split.length>1) return OnlyNumbersAllowed(split[0])+'.'+OnlyNumbersAllowed(split[1]); 
    else return OnlyNumbersAllowed(split[0]); 
} 

function OnlyNumbersAllowed(val){ 
return val.replace(/\D/g, ''); 
} 

http://jsfiddle.net/Qxtnd/7/ Вы можете поместить Исли это регулярное выражение в какой-либо функции, вместо того, чтобы писать, что у вас есть сейчас.

+0

. Я использую функцию allowOnlyNumbers в других местах, так что не могу оставить то, что у меня есть – seesoe

+0

@ Превосходно принять сейчас – ccd580ac6753941c6f84fe2e19f229

+0

@Kuraiinazuma Даже сейчас это не работает. Вы не можете иметь более 1 десятичной точки в валюте, и ему нужно всего 2 десятичных знака. – Precastic

Смежные вопросы