【问题标题】:Formatting TextField text as Price将 TextField 文本格式化为价格
【发布时间】: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;

  }

我还附上了截图。 如何用十进制值格式化字符串...... 提前致谢

【问题讨论】:

  • 你可以限制用户进入。在您的文本字段中

标签: iphone ios objective-c


【解决方案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 等等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多