我目前正在使用Xcode中的iOS应用程序,我想出了一些代码来计算有效位数。它是用C ++编写的,但我做了一些改动才能使它工作。每当我输入零值时,它就会崩溃,其他任何事情都可以正常工作。
我的代码如下:
- (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;
}
}
请帮助,我相信它与数字在内存中的表示方式有关...但是当我把它放在while语句中时,NSLog工作了......任何输入都很受欢迎。
谢谢
答案 0 :(得分:0)
while (text1.at(0) == '0' || text1.at(0) == '.')//Trim Leading Zeros...
{
text1 = text1.substr(1);
}
我相信这就是你的问题所在。您的测试字符串'0.0'仅包含0和。字符。循环3次后,text1为空字符串,但你仍然试图访问第一个字符。
这条线也可能不符合你的期望: if([[thetextfield text] doubleValue] == 0.0)
任何不是数字的东西都会被转换为0.0,所以[@"foo" doubleValue] == 0.0
也是如此。
这里还有很多其他问题,比如使用UTF8String。如果用户键入除ascii字符以外的任何内容,则会发生奇怪的事情。
你真的不需要任何C ++。仅使用目标C这将非常容易。
其他几条评论......你可能想要if / else if / else if而不只是3连续的elses。
最后一个if也可以很容易地转换为:
if ([[thetextfield text] doubleValue] == 0.0)
{
newLength = 1;
NSString *zeroVal = [NSString stringWithFormat:@"%i", newLength];
self.display3.text = zeroVal;
}
到
if (...) {
self.display3.text = @"1";
}