2016-04-13 2 views
0

Я пишу JavaScript/JQuery метод для реорганизации входного значения вставленного числа в поле ввода. Коллекция nonFractions - это числа перед десятичным разделителем. Однако, когда я запускаю этот сценарий, я получаю вопрос, что в следующей строке:JavaScript: Collection is null in for loop

for(var i=0 ; i < nonFractions.length ; i++) { 

Моя переменная nonFractions равна заключается в null. Как это происходит? Я не вижу проблемы.

Мой общий код:

$("#queryInstructedAmountFrom").change(function(){ 
    var amount = $("#queryInstructedAmountFrom").val(); 
    amount = removeZeros(amount); 
    var splittedValues = amount.split(/[,.]/); 
    amount = ""; 

    if(splittedValues.length == 1) { 
     amount += splittedValues[0]; 
     var nonFractions = amount.match(/.{1,3}/g); 
     var firstIndex = amount.length % 3; 
     if(firstIndex != 0) { 
     var firstNumbers = amount.substr(0, firstIndex); 
     amount = amount.substr(firstIndex); 
     nonFractions = amount.match(/.{1,3}/g); 

     amount = ""; 

     amount += firstNumbers; 
     amount += thousandSeparator; 
     } else { 
      amount = ""; 
     } 
     for(var i=0 ; i < nonFractions.length ; i++) { 
      amount += nonFractions[i]; 

      if(i < (nonFractions.length - 1)){ 
       amount += thousandSeparator; 
      } 
     } 

     amount += decimalSeparator; 
     amount += "00"; 
    } else { 
     for(var i=0 ; i < splittedValues.length - 1 ; i++) { 
      amount += splittedValues[i]; 
     } 

     nonFractions = amount.match(/.{1,3}/g); 
     var firstIndex = amount.length % 3; 
     alert(firstIndex); 
     if(firstIndex == 0) { 
      nonFractions = amount.match(/.{1,3}/g); 
     } 

     if(firstIndex > 1) { 
      var firstNumbers = amount.substr(0, firstIndex); 
      amount = amount.substr(firstIndex); 
      nonFractions = amount.match(/.{1,3}/g); 

      amount = ""; 
      amount += firstNumbers; 
      amount += thousandSeparator; 
     } else { 

      alert(nonFractions); 
      amount = ""; 
     } 
     for(var i=0 ; i < nonFractions.length ; i++) { 
      amount += nonFractions[i]; 

      if(i < (nonFractions.length - 1)){ 
       amount += thousandSeparator; 
      } 
     } 

     amount += decimalSeparator; 
     amount += splittedValues[splittedValues.length -1]; 
    } 

Может кто-нибудь дать мне решение?

+0

Не могли бы вы столкнуться с проблемой, потому что ваше объявление переменной находится в вашем начале, если утверждение? Что произойдет, если splittedValues.length! = 1? – Dresden

ответ

3
nonFractions = amount.match(/.{1,3}/g); 

Если amount.match не находит регулярное выражение, который вы ищете, она возвращает null. See MDN.

Вы можете обойти эту проблему, добавив условие:

if (nonFractions == null) { 
    nonFractions = []; 
} 
1
... 
if(firstIndex != 0) { 
    var firstNumbers = amount.substr(0, firstIndex); 
    amount = amount.substr(firstIndex); 
    nonFractions = amount.match(/.{1,3}/g); 
... 

Если вход был первоначально значение «1», в этот момент, firstNumbers становится «1», то сумма substringed и становится '', то вы снова пытаетесь совместить символы, но поскольку сумма пустая строка, нет совпадения, а nonFractions становится null.

Что именно ваша цель? Я бы предложил вам создать таблицу ввода/вывода, чтобы лучше понять, что должен делать ваш алгоритм.