Jim*_*des 9 iphone currency uitextfield nsnumberformatter
我正在使用一个包含本地化货币值的UITextField.我已经看过很多关于如何使用它的帖子,但我的问题是:如何在每次按键后将货币格式重新应用到UITextField?
我知道我可以设置和使用货币格式化程序:
NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
...
[currencyFormatter stringFromNumber:...];
Run Code Online (Sandbox Code Playgroud)
但我不知道如何勾选它.
例如,如果字段中的值显示为"$ 12,345"并且用户点击"6"键,则该值应更改为"$ 123,456".
哪个回调是执行此操作的"正确"(我应该使用textField:shouldChangeCharactersInRange:replacementString:或自定义目标操作),如何使用NSNumberFormatter解析并重新应用格式到UITextField的文本属性?
任何帮助将非常感激!谢谢!
我一直在研究这个问题,我想我找到了一个很好的,干净的解决方案.我将向您展示如何正确更新用户输入的文本字段,但您必须自己弄清楚本地化,无论如何该部分应该很容易.
- (void)viewDidLoad
{
[super viewDidLoad];
// setup text field ...
#define PADDING 10.0f
const CGRect bounds = self.view.bounds;
CGFloat width = bounds.size.width - (PADDING * 2);
CGFloat height = 30.0f;
CGRect frame = CGRectMake(PADDING, PADDING, width, height);
self.textField = [[UITextField alloc] initWithFrame:frame];
_textField.backgroundColor = [UIColor whiteColor];
_textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
_textField.autocapitalizationType = UITextAutocapitalizationTypeNone;
_textField.autocorrectionType = UITextAutocorrectionTypeNo;
_textField.text = @"0";
_textField.delegate = self;
[self.view addSubview:_textField];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// force update for text field, so the initial '0' will be formatted as currency ...
[self textField:_textField shouldChangeCharactersInRange:NSMakeRange(0, 0) replacementString:@"0"];
}
- (void)viewDidUnload
{
self.textField = nil;
[super viewDidUnload];
}
Run Code Online (Sandbox Code Playgroud)
这是UITextFieldDelegate方法中的代码textField:shouldChangeCharactersInRange:replacementString:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *text = _textField.text;
NSString *decimalSeperator = @".";
NSCharacterSet *charSet = nil;
NSString *numberChars = @"0123456789";
// the number formatter will only be instantiated once ...
static NSNumberFormatter *numberFormatter;
if (!numberFormatter)
{
numberFormatter = [[NSNumberFormatter alloc] init];
numberFormatter.numberStyle = NSNumberFormatterCurrencyStyle;
numberFormatter.maximumFractionDigits = 10;
numberFormatter.minimumFractionDigits = 0;
numberFormatter.decimalSeparator = decimalSeperator;
numberFormatter.usesGroupingSeparator = NO;
}
// create a character set of valid chars (numbers and optionally a decimal sign) ...
NSRange decimalRange = [text rangeOfString:decimalSeperator];
BOOL isDecimalNumber = (decimalRange.location != NSNotFound);
if (isDecimalNumber)
{
charSet = [NSCharacterSet characterSetWithCharactersInString:numberChars];
}
else
{
numberChars = [numberChars stringByAppendingString:decimalSeperator];
charSet = [NSCharacterSet characterSetWithCharactersInString:numberChars];
}
// remove amy characters from the string that are not a number or decimal sign ...
NSCharacterSet *invertedCharSet = [charSet invertedSet];
NSString *trimmedString = [string stringByTrimmingCharactersInSet:invertedCharSet];
text = [text stringByReplacingCharactersInRange:range withString:trimmedString];
// whenever a decimalSeperator is entered, we'll just update the textField.
// whenever other chars are entered, we'll calculate the new number and update the textField accordingly.
if ([string isEqualToString:decimalSeperator] == YES)
{
textField.text = text;
}
else
{
NSNumber *number = [numberFormatter numberFromString:text];
if (number == nil)
{
number = [NSNumber numberWithInt:0];
}
textField.text = isDecimalNumber ? text : [numberFormatter stringFromNumber:number];
}
return NO; // we return NO because we have manually edited the textField contents.
}
Run Code Online (Sandbox Code Playgroud)
编辑1:修复内存泄漏.
编辑2:为Umka更新 - 处理0小数点后分隔符.代码也为ARC更新.
| 归档时间: |
|
| 查看次数: |
12510 次 |
| 最近记录: |