Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 导致0 Obj C的未知错误_Ios_Currency_Nsnumberformatter - Fatal编程技术网

Ios 导致0 Obj C的未知错误

Ios 导致0 Obj C的未知错误,ios,currency,nsnumberformatter,Ios,Currency,Nsnumberformatter,我的代码似乎是正确的,但由于某种原因,在我在字段中输入数字后,每个文本字段(工作日除外)都变成了零。有人能看一下下面的代码,看看我可能做错了什么吗 - (IBAction)calculateButtonPressed:(UIButton *)sender { float bonusRate = [self fetchActualValue:self.bonusTextField.text]; float deductionsRate = [self fetchActualValu

我的代码似乎是正确的,但由于某种原因,在我在字段中输入数字后,每个文本字段(工作日除外)都变成了零。有人能看一下下面的代码,看看我可能做错了什么吗

- (IBAction)calculateButtonPressed:(UIButton *)sender
{
    float bonusRate = [self fetchActualValue:self.bonusTextField.text];
    float deductionsRate = [self fetchActualValue:self.deductionTextField.text];
    float dailyRate = [self fetchActualValue:self.dailyRateTextField.text];
    float daysWorked = [self fetchActualValue:self.daysWorkedTextField.text];
    float grossPay = dailyRate * daysWorked + bonusRate;
    float taxRate = .72;
    float ssRate = .0620;
    float medRate = .0145;
    float medgrossrate = grossPay * medRate;
    float ssgrossrate = grossPay * ssRate;
    float nillRate = 1;
    float bonusTax = .75;
    float bonusLeft = bonusRate * bonusTax;
    float net = medgrossrate + ssgrossrate;
    if (medTaxSwitchOutlet.on) medRate = medRate;
    else medRate = nillRate;
    if (ssTaxSwitchOutlet.on) ssRate = ssRate;
    else ssRate = nillRate;
    if (fedTaxSwitchOutlet.on) taxRate = taxRate;
    else taxRate = nillRate;

    float netPay = grossPay * taxRate + bonusLeft - net - deductionsRate;
    self.dailyRateTextField.text = [self fetchFormattedTextValue:dailyRate];
    self.netIncomeTextField.text = [self fetchFormattedTextValue:netPay];
    self.grossIncomeTextField.text = [self fetchFormattedTextValue:grossPay];
    self.bonusTextField.text = [self fetchFormattedTextValue:bonusRate];
    self.deductionTextField.text = [self fetchFormattedTextValue:deductionsRate];
}
- (NSString*)fetchFormattedTextValue:(float)value{
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
    NSString *numberAsString = [numberFormatter stringFromNumber:[NSNumber numberWithFloat:value]];
    return numberAsString;
}

- (float)fetchActualValue:(NSString*)strValue{
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
    float num = [[numberFormatter numberFromString:strValue] floatValue];
    return num;
}

一个问题是
fetchActualValue:
方法将返回
0f
作为您在UI中显示的字符串

float daysWorked = [self fetchActualValue:self.daysWorkedTextField.text];
上面的一行将days worked文本字段中的字符串(在您的示例中是字符串
@“28”
)传递给
fetchActualValue:
方法。我怀疑原因是该方法只解析符合数字样式
NSNumberFormatterCurrencyStyle
的数字。对于工作天数计算,请尝试将
floatValue
消息发送到
daysWorkedTextField.text
。也就是说,将上述行替换为:

float daysWorked = [self.daysWorkedTextField.text floatValue];

我还要补充两点——一般来说,格式化程序上的数字样式和日期样式应该用于格式化用户的输出,但使用它们格式化输入可能容易出错。此外,使用浮点数进行财务计算也是非常困难的。

您是否尝试过在代码中设置断点,然后检查这些值是否如您所期望的那样?是的,它只是冻结并显示(lldb)。我检查了调试日志,什么都没有。我做错了吗?很抱歉,我是个新手。它冻结并显示
(lldb)
意味着它在您的断点处停止。这就是你想要的。现在打印出值并逐步完成代码。您可能希望找到一个关于使用调试器的好教程。您是否意识到使用float而不是double会导致明显的错误?Carl谢谢!我最终在同一个上下文中更改了所有浮动(即:bonusRate、DecrectionRate、dailyRate和daysWorked),现在它给了我需要的值!我想我理解你最后两点的意思。这个应用程序是为海外承包商开发的,它还有很多工作要做。作为一名编程新手,我一直在学习。我想我需要研究一下浮球和双打的区别。我以前没有使用过Double,但我计划在回答后再使用它。另外,如果你不介意的话,还有一个问题……现在它计算总收入和净收入字段,如果我再次按我的操作按钮(计算),它会将所有字段归零(如果我在初始计算后再次点击计算)。是否有一种方法可以保留此数据,以便在用户更改某个字段的值时不会重置它?我希望我没有感到困惑。双打不能解决问题,也许看看NSDecimalNumber。对不起,我不理解你的其他评论。如果你在文本字段中输入所有值,然后按“计算”,它就会工作。但是,如果你再按一次Calculate,所有字段都会归零…除了工作天数。我不清楚为什么会是。。。我建议开始新一轮的调试、研究,并在必要时提出问题。。。