将 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?

如何在按钮 onClick 方法上动态设置 TextField 上的 ErrorMessage

textField常用的属性

将十进制值格式化为具有 2 个小数位的货币 [重复]

Swift UICollectionView 文本字段

将 Excel 格式化为文本格式