【问题标题】:What am I doing wrong in textfield Did End Editting?? Currency Formatting我在文本字段中做错了什么是否结束编辑?货币格式
【发布时间】:2014-03-11 23:59:38
【问题描述】:

所以部分代码看起来像

- (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 美元。有人知道我在做什么错吗?

【问题讨论】:

    标签: ios nsstring uitextfield nsnumberformatter currency-formatting


    【解决方案1】:

    问题在于:

    [self.SalesAmounttext.text doubleValue]
    

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

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

    - (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];
    }
    

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

    【讨论】:

    • 我刚刚实现了你的代码。现在,每次我完成编辑时,整个文本字段都是空的。
    • 正如我所说,您可能需要进一步检查。如果您只是输入一个纯数字,很可能货币格式化程序将失败。我会更新一下我的答案。
    • 好的,我又加了一张支票。这应该处理已经是有效货币值的值以及明确输入的数字。
    【解决方案2】:

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

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

    所以你可以这样做:

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

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

    【讨论】:

    • 比这更复杂。根据用户的语言环境,您建议的结果可能类似于5 000,50doubleValue 方法无法处理的其他格式的十进制数。
    猜你喜欢
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多