2013-11-06 3 views
0

Я пытаюсь реализовать простой калькулятор javascript-html. То, что я хочу сделать, - это ввести только один ». пользователем. Как я могу это контролировать? Вот код, который я пробовал.Позволяет пользователю нажимать только один «.».

Я уже могу найти номер '.' но теперь я запутался и эта функция replaceAll не заменяет «.» с пустой строкой.

String.prototype.replaceAll = function(search, replace) 
{ 
    //if replace is null, return original string otherwise it will 
    //replace search string with 'undefined'. 
    if(!replace) 
     return this; 

    return this.replace(new RegExp('[' + search + ']', 'g'), replace); 
}; 
function calculate(){ 
    var value = document.calculator.text.value; 
    var valueArray = value.split(""); 
    var arrayLenght = valueArray.length; 
    var character = "."; 
    var charCount = 0; 
    for(i=0;i<arrayLenght;i++){ 
     if (valueArray[i]===character) { 
      charCount += 1; 
     } 
    } 
    if(charCount>1){ 
     var newValue=value.replaceAll(".",""); 
     alert(newValue);  
    } 
} 

ответ

0

Недавно я совершил это с следующий код. Он сидел в функции, которая была активирована для каждого нажатия клавиши на поле. Это может быть немного грязно, и я уверен, что есть лучший способ, но он работает. Он также позволяет кому-то ввести «.». если у них есть один выбран, так как он будет заменить, что выбрал:

// Function to verify number 
function isNumber(n) { 
    return !isNaN(parseFloat(n)) && isFinite(n); 
} 

// Function called (below) to get text if it is selected 
function getSelectionText() { 
    var text = ""; 
    if (window.getSelection) { 
     text = window.getSelection().toString(); 
    } else if (document.selection && document.selection.type != "Control") { 
     text = document.selection.createRange().text; 
    } 
    return text; 
} 

// jQuery function on keypress for the textbox 
$(".textbox").on("keypress", function (e) { 
     var fieldVal = $(this).val(); 
     if (e.keyCode == 9) return true; // tab 
     var keyPressed = String.fromCharCode(e.keyCode); 
     if (keyPressed == "." && ((fieldVal.indexOf(".") == -1) || getSelectionText().indexOf(".") > 0)) return true; // decimal places, only allow one 
     return (isNumber(keyPressed)); 
    }); 

EDIT: Я должен упомянуть, функция IsNumber() также проверяет, чтобы убедиться в том, что конечный результат является числом. Я могу опубликовать это, если вы тоже захотите.

EDIT 2: Измененный блок кода для добавления функции isNumber().

+0

@Tartar Я обновил, чтобы добавить функцию isNumber(). – trnelson

+0

Кстати, пользователи не набирают ключи на моем калькуляторе, все номера - это кнопки, поэтому для моего калькулятора это будет бесполезно. – Tartar

+0

@Tartar ahhh ладно, я неправильно понял. Вероятно, вы могли бы немного переработать функцию, чтобы активировать нажатие кнопки, а затем проверить значение соответствующей кнопки. – trnelson

0

Ваша (главная) проблема заключается в следующем тесте:

if(!replace) 

При замене является "", !"" является true.

Изменить тест на

if (replace==null) 

(она работает как undefined и null)

Но я действительно не понимаю, почему вы должны определить replaceAll функцию, когда вы, кажется, хотите

var newValue=value.replace(/\./g,""); 

EDIT: Если вы, Муравей заменить все точки, кроме первого, который вы можете сделать

var i=0, newValue=value.replace(/\./g, function(){ return i++ ? "," : "." }); 

(вам не нужно рассчитывать, что до того, и i будет подсчет точек)

+0

Спасибо, это исправило проблему replaceAll, но моя главная проблема - разрешить только один «.». для пользователя. – Tartar

+0

Вы хотите сказать, что хотите заменить, начиная со второго? –

+0

Да, только один "." должно быть разрешено. – Tartar

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