2012-04-20 3 views
0

В настоящее время я работаю над приложением iOS в Xcode, и я придумал код для подсчета числа значимых цифр. Он написан на C++, но я сделал некоторые изменения, чтобы заставить его работать. Всякий раз, когда я вводим нулевое значение, он сбой, а все остальное работает отлично.Сбой отладчика iOS при вводе 0.0 В текстовом поле

Мой код выглядит следующим образом:

- (IBAction)sigFigCount:(UITextField *)thetextfield 
{ 
length = 0; 
if (thetextfield == _textfield1) 
{ 
    if ([thetextfield.text length] > 0)//If TextField Has More Than 0 digits... 
    { 
     text1 = std::string([_textfield1.text UTF8String]); 
     while (text1.at(0) == '0' || text1.at(0) == '.')//Trim Leading Zeros... 
     { 
      text1 = text1.substr(1); 
     } 
     length = text1.length(); 
     decimal = text1.find('.'); 
     if (decimal >= 0 && decimal < text1.length())//Dont count decimal as sig fig... 
     { 
      length -= 1; 
     } 
     if ([[_textfield1 text] doubleValue] == 0.0) 
     { 
      NSLog(@"HERE"); 
      self.display3.text = @"1"; 
     } 
     NSString *siggy = [NSString stringWithFormat:@"%i", length]; 
     self.display3.text = siggy; 
    } 
    if ([thetextfield.text length] == 0) 
    { 
     length = 0; 
     NSString *ifzero = [NSString stringWithFormat:@"%i", length]; 
     self.display3.text = ifzero; 
    } 
    if ([[thetextfield text] doubleValue] == 0.0) 
    { 
     newLength = 1; 
     NSString *zeroVal = [NSString stringWithFormat:@"%i", newLength]; 
     self.display3.text = zeroVal; 
    } 
    NSString *norm = [NSString stringWithFormat:@"%i", length]; 
    self.display3.text = norm; 
} 
} 

Пожалуйста, помогите, я считаю, что это что-то делать с тем, как числа представлены в памяти ... но NSLog работал, когда я положил его в то время как заявление ... Приветствуется любой ввод.

Спасибо

+0

Сбои с чем? Где находится журнал сбоев? – 0x8badf00d

+0

Там действительно не было журнала сбоев, его выход был «завершен, вызванный выбросом исключения», и iOS Simulator завершает работу. – JoeyLaBarck

ответ

0
while (text1.at(0) == '0' || text1.at(0) == '.')//Trim Leading Zeros... 
     { 
      text1 = text1.substr(1); 
     } 

Я считаю, что это, где ваша проблема. Ваша тестовая строка «0.0» содержит только 0 и. персонажи. Через 3 раза через цикл текст1 является пустой строкой, но вы все еще пытаетесь получить доступ к первому символу.

Эта линия также, вероятно, не делать то, что вы ожидаете: если ([[текст thetextfield] doubleValue] == 0,0)

Все, что не число будет преобразуются в 0.0, так [@"foo" doubleValue] == 0.0 верно, как Что ж.

Здесь также немало проблем, связанных с использованием UTF8String. Если пользователь набрал ничего, кроме символов низкого ascii, будут происходить странные вещи.

Вам действительно не нужен C++ здесь. Это было бы очень легко с объективным C.

Еще пара комментариев ... Вы, вероятно, захотите, если/else if/else, если вместо трех последовательных elses.

Последнее, если может быть легко преобразован из:

if ([[thetextfield text] doubleValue] == 0.0) 
    { 
     newLength = 1; 
     NSString *zeroVal = [NSString stringWithFormat:@"%i", newLength]; 
     self.display3.text = zeroVal; 
    } 

в

if (...) { 
    self.display3.text = @"1"; 
} 
+0

Спасибо, Мэтт, у меня есть только десятичная пэд, и я не буду допускать никаких символов, кроме числа и десятичной точки. Я добавил оператор в цикле while && [_textfield1 text] doubleValue]! = 0.0), поэтому он не будет выполнять цикл while, если значение равно нулю. но по какой-то причине, если я ставлю 0,00, он говорит, что 3 сиг-фига. Я не могу понять, почему. – JoeyLaBarck

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