2

所以一部分代码看起来像

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    NSNumber *currency = [NSNumber numberWithDouble:[self.SalesAmounttext.text doubleValue]]; 

  self.SalesAmounttext.text = [formatter stringFromNumber:currency];

}

上面的代码意味着如果我在文本字段中输入 499,文本将被转换为 $499.00。如果我清除整个文本字段,然后重新输入另一个数字,比如 599,文本将转换为 $599.00。这些都是正确和预期的行为。

但是,如果我碰巧将 599.00 美元退格到仅 5 美元或 5 美元,然后输入一个新数字(例如 509)并离开文本字段,我的文本字段输出变为 0.00 美元。有人知道我做错了什么吗?

4

2 回答 2

2

问题在于:

[self.SalesAmounttext.text doubleValue]

仅当文本没有格式、没有货币符号、没有分组字符和小数点分隔符的句点时,才会给出有效值。如果不完全正确,则返回 0。

您需要double使用货币格式化程序将现有文本转换为 a 来解析文本。

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    NSNumber *current = [formatter numberFromString:self.SalesAmounttext.text];
    if (!current) {
        NSNumberFormatter *formatter2 = [[NSNumberFormatter alloc] init];
        current = [formatter2 numberFromString:self.SalesAmounttext.text];
    }

    self.SalesAmounttext.text = [formatter stringFromNumber:current];
}

您可能需要一些额外的检查来处理无效数字。

于 2014-03-12T00:05:30.123 回答
1

doubleValue如果您传递的第一个字符不是有效数字,该方法将返回 0。从文档:

“接收器文本的浮点值作为双精度值。上溢时返回HUGE_VAL–HUGE_VAL,下溢时返回 0.0。如果接收器不以浮点数的有效文本表示开始,则返回 0.0。”

因此,您可以执行以下操作:

NSString *newString = [self.SalesAmounttext.text stringByReplacingOccurrencesOfString:@"$" withString:@""];

并将 newString 传递给格式化程序。

于 2014-03-12T00:07:42.083 回答