【发布时间】:2014-01-12 18:25:23
【问题描述】:
我的应用程序上有一个 UITextField,它只接收来自用户的数字输入。此数字输入表示货币,默认值为 0.00。
当用户输入数字时,我想创建一个类似于掩码的东西来格式化 UITextField。例如:
9 变为 $0,09 99 变为 $0,99 999 变成 $999,99
下面的代码效果很好,但由于我使用的是整数和浮点值,因此应用程序最终会在某个点之后显示错误的值。例如:
999999999 变为 100000000
这是因为浮点数和整数不够精确,应该使用 NSDEcimalNumber。关键是我不知道如何将我的整数和浮点值替换为 NSDecimalNumber。
有人可以帮我解决这个问题吗?我花了一些时间在网上搜索解决方案,但没有找到适合我的需求和大量遇到相同问题的人。
代码如下:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField.tag == 1){
NSString *cleanCentString = [[textField.text componentsSeparatedByCharactersInSet: [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
NSInteger centValue= cleanCentString.integerValue;
if (string.length > 0)
{
centValue = centValue * 10 + string.integerValue;
}
else
{
centValue = centValue / 10;
}
NSNumber *formatedValue;
formatedValue = [[NSNumber alloc] initWithFloat:(float)centValue / 100.0f];
NSNumberFormatter *_currencyFormatter = [[NSNumberFormatter alloc] init];
[_currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
textField.text = [_currencyFormatter stringFromNumber:formatedValue];
return NO;
}
if (textField.tag == 2){
// Nothing for now
}
return YES;
}
【问题讨论】:
-
你有一个更大的问题。您假设输入的货币是货币价值的 100 分之一,例如美分。例如,日本人不会高兴,因为日元只是整日元。您应该在将数字格式化程序设置为货币样式后询问它,看看它设置了多少个小数位。
-
你是对的,rmaddy。待办事项不断增加=D
-
就我个人而言,我认为最好让用户输入一个没有“随用随取”处理的原始数字。在用户离开文本字段之前,不要格式化原始数字。作为用户,当我真正想要小数时,我宁愿输入小数分隔符。如果我输入
9,那么我的意思是九美元,而不是九美分。如果我想要 9 美分,那么我想输入.09。让后处理格式为$0.09或我完成输入后的任何内容。不要让我输入900来获得九美元。但这只是一种观点。 -
嗯,这是一个有趣的观点。也许会更好。
-
@Carlos 我使用你的方法并遇到了同样的问题。我检查了以下答案,但有些我无法解决。你能帮我解决这个问题吗?你能用更正的方法编辑相同的方法吗?
标签: ios objective-c uitextfield