将 TextField 文本格式化为价格
Posted
技术标签:
【中文标题】将 TextField 文本格式化为价格【英文标题】:Formatting TextField text as Price 【发布时间】:2013-05-22 05:22:18 【问题描述】:我想在用户输入值时格式化文本字段文本。它工作得很好,但我的问题是,如果用户在小数点后按 1 然后按 2。我的替换字符串是“12”。当时numbar是12。我不能带小数点..
NSNumber* number = [numberFormatter numberFromString:string];
这是我的完整代码,
#pragma mark textfieldDelgate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
NSLocale *locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_GB"];
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setLocale:locale];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSString *text = [textField text];
NSString *replacementText = [text stringByReplacingCharactersInRange:range withString:string];
NSMutableString *newReplacement = [[ NSMutableString alloc ] initWithString:replacementText];
NSString *currencyGroupingSeparator = numberFormatter.currencyGroupingSeparator;
[newReplacement replaceOccurrencesOfString:currencyGroupingSeparator withString:@"" options:NSBackwardsSearch range:NSMakeRange(0, [newReplacement length])];
NSNumber * number = [numberFormatter numberFromString:newReplacement];
if (number == nil && [replacementText length]!=0)
return NO;
NSLog(@"%@",newReplacement);
text = [numberFormatter stringFromNumber:number];
[textField setText:text];
return NO;
我还附上了截图。 如何用十进制值格式化字符串...... 提前致谢
【问题讨论】:
你可以限制用户进入。在您的文本字段中 【参考方案1】:对我来说这行代码:
NSNumber * number = [numberFormatter numberFromString:newReplacement];
不返回 nil,但会删除用户输入的小数。这是因为您使用 numberFormatter id 传递了一个像“12”这样的值。或 '12.0' 它将删除小数点作为格式化的一部分。对于 12.3 等其他值,它不会删除小数。
我无法理解您对进行所有这些编码的要求,但如果您希望小数存在,请使用一些逻辑来检查数字的格式是否为 12. 或 12.0 ,然后转义格式。小数点将保留在那里。
请使用此代码:
NSNumber * number;
if ([newReplacement hasSuffix:@"."] || [newReplacement hasSuffix:@".0"])
[textField setText:newReplacement]; return NO;
else
number = [numberFormatter numberFromString:newReplacement];
【讨论】:
感谢您的回复。如果用户在该小数点后按 1,则按 2。我的替换字符串是“12”。那时numbar是nil 我不认为它是 nil,我只能看到它正在删除小数。输入 12.12 时显示 1212。按 12.12 时看到 nil 吗? 抱歉数字是 12 。所以我关心的是如何取小数点 替换代码行:NSNumber * number = [numberFormatter numberFromString:newReplacement];用这个:NSNumber * number; if ([newReplacement hasSuffix:@"."] || [newReplacement hasSuffix:@".0"]) [textField setText:newReplacement];返回否; else number = [numberFormatter numberFromString:newReplacement]; 它就像一个魅力。您可以将此行添加到您的答案中吗?我将标记为accepted answer。谢谢..【参考方案2】:如果您正在处理格式化资金,您可能希望使用NSNumberFormatterCurrencyStyle
而不是NSNumberFormatterDecimalStyle
。设置后它可能就是 Just Work™。
但是,它可能不会。不管怎样,很确定你看到的行为的原因是你没有从你的字符串中给它一个数字; 12
是一个数字,12.5
也是,但 12.
不是。我很惊讶它没有直接返回nil
。
如果是这种情况(并且它仍然损坏),那么您可能希望在末尾添加 .
的特殊情况,并附加而不是将其传递给数字格式化程序。
【讨论】:
【参考方案3】:我已尝试在我的日志中打印您的代码。它对我来说工作正常。我认为还有其他类型的问题。
NSLocale *locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_GB"];
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setLocale:locale];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber* number = [numberFormatter numberFromString:@"12.4"];
NSLog(@"number is %@",number);
日志打印-----
数字是 12.4
【讨论】:
感谢您的回复。你能在 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 中试试这个代码吗 是的,我已经尝试过了,当我输入 12.5 时,它在 textField 中显示 125。它将 .(decimal) 替换为空白 如果您输入一个大于 0 的数字,它将通过,但如果您想输入 12.09,它总是会更改为 12,因为格式化程序会将其视为整数。原因是你把它放在每次按键时都会调用的 shouldChangeCharactersInRange 中。 你的意思是.0中的问题让我试试 现在我明白你想要什么了吗?【参考方案4】://Add this in .h file
NSNumberFormatter *formatter;
NSInteger currencyScale;
NSString *enteredDigits;
//Add this in .m file`enter code here`
-(void)viewdidload
NSNumberFormatter *aFormatter = [[NSNumberFormatter alloc] init];
[aFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
currencyScale = -1 * [aFormatter maximumFractionDigits];
self.formatter = aFormatter;
#pragma UItextfield Delegate
- (void)textFieldDidBeginEditing:(UITextField *)textField
// Keep a pointer to the field, so we can resign it from a toolbar
Field = textField;
if(textField.text==NULL || [textField.text isEqualToString:@""])
self.enteredDigits = @"";
//textField.text=@"";
- (void)textFieldDidEndEditing:(UITextField *)textField
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string //give tag to text field
if (textField.tag==10)
// self.priceInput = textField;
// Check the length of the string
int len=[self.enteredDigits length];
NSLog(@"string lenght is %d",len);
if ([string length])
self.enteredDigits = [self.enteredDigits stringByAppendingFormat:@"%d", [string integerValue]];
else
// This is a backspace
NSUInteger len = [self.enteredDigits length];
if (len > 1)
self.enteredDigits = [self.enteredDigits substringWithRange:NSMakeRange(0, len - 1)];
else
self.enteredDigits = @"";
NSDecimalNumber *decimal = nil;
if ( ![self.enteredDigits isEqualToString:@""])
decimal = [[NSDecimalNumber decimalNumberWithString:self.enteredDigits] decimalNumberByMultiplyingByPowerOf10:currencyScale];
float deci= [decimal floatValue];
NSLog(@"decimall==%f",deci);
else
decimal = [NSDecimalNumber zero];
// Replace the text with the localized decimal number
float deci= [decimal floatValue];
NSLog(@"decimall==%f",deci);
NSString *temp = [self.formatter stringFromNumber:decimal];
textField.text=temp;
//NSLog(@"Text fielddddddddddddddf=%@ %@",numberText,temp);
return NO;
return YES;
- (BOOL)textFieldShouldClear:(UITextField *)textField
textField.text=@"";
self.enteredDigits=@"";
NSLog(@"Clear Clicked");
return YES;
I think this code will help you
【讨论】:
这里你得到两个小数点的值,例如:0.01,0.12,1.24,12.40 等等以上是关于将 TextField 文本格式化为价格的主要内容,如果未能解决你的问题,请参考以下文章
将Classic Textfield动态转换为TFL Textfield?