【问题标题】:Limit number of digits before & after decimal points in UITextField限制 UITextField 中小数点前后的位数
【发布时间】:2013-04-20 12:36:07
【问题描述】:

我想限制在 UITextField 中输入的数字。这是我的代码

#define MAX_NO_OF_DIGITS_BEFORE_DECIMAL 8

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    switch (textField.tag)
    {
        case BUY_ITEM_TEXTFIELD_TAG:
        {
            if (![textField.text length]>0) {
                textField.text = [CURRENCY_TYPE stringByAppendingFormat:@"%@",self.buyTextField.text];
            }
        }
            break;
        case BID_INCREMENT_TEXTFIELD_TAG:
        {
            if (![textField.text length]>0) {
       textField.text = [CURRENCY_TYPE stringByAppendingFormat:@"%@",self.bidTextField.text];
            }
        }
            break;
        case STARTING_BID_TEXTFIELD_TAG:
        {
            if (![textField.text length]>0) {
        textField.text = [CURRENCY_TYPE stringByAppendingFormat:@"%@",self.startingBidTextField.text];
            }
        }
            break;
        case SHIPPING_CHARGES_TEXTFILED:
        {
            if (![textField.text length]>0) {
         textField.text = [CURRENCY_TYPE stringByAppendingFormat:@"%@",self.chargesTextField.text];
            }
        }
            break;
        default:
            break;
    }
    
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    
    // Check if we have 8 digits before decimal points
    NSString *tempStr = [newString stringByReplacingOccurrencesOfString:CURRENCY_TYPE withString:@""];
    if ([tempStr length]==MAX_NO_OF_DIGITS_BEFORE_DECIMAL)
    {
        // Check if we have only 1 decimal point
        NSArray  *arrayOfString = [newString componentsSeparatedByString:@"."];
        if ([arrayOfString count] > 2 )
        {
            return NO;
        }
        else {
            textField.text = [NSString stringWithFormat:@"%@%@%@",CURRENCY_TYPE,tempStr,@"."];
        }
    }
    
    
    // Check if we have only 1 decimal point
    NSArray  *arrayOfString = [newString componentsSeparatedByString:@"."];
    if ([arrayOfString count] > 2 )
    {
        return NO;
    }
    
    
    // Check if we have only 2 digits after decimal point
    if([arrayOfString count]>=2)
    {
        NSString *sepStr=[NSString stringWithFormat:@"%@",[arrayOfString objectAtIndex:1]];
        return !([sepStr length]>2);
    }
    
    return YES;
    
}

但我的问题是当我输入 12345678 时,它会在 8 之后放置小数点并再次放置 8 所以我的输出看起来像 12345678.8 而不是 12345678.

我想要达到的是

1) 用户只能在小数点前输入 MAX_NO_OF_DIGITS_BEFORE_DECIMAL 和小数点后 2 位

我不明白为什么最后 8 个在此重复。有人可以帮帮我吗?

提前致谢。

【问题讨论】:

    标签: ios6 uitextfield limit digits uitextfielddelegate


    【解决方案1】:

    试试下面的代码

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range  replacementString:(NSString *)string
    

    {

    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    
    // Check if we have 3 digits before decimal points
    int maxNoOfDigitsBeforeDecimal = 3;
    // Check if we have 2 digits after decimal points
    int maxNoOfDigitsAfterDecimal = 2;
    
    // Check if we have no decimal point yet and more than 3 digits are entered
    NSArray  *arrayOfString = [newString componentsSeparatedByString:@"."];
    
    if (([arrayOfString count] == 1 ) && ([newString length] > maxNoOfDigitsBeforeDecimal))
    {
        return NO;
    }
    
    
     // Check if we have only 1 decimal point
    if ([arrayOfString count] > 2 )
        return NO;
    
    // Check if we have only 2 digits after decimal point
    if([arrayOfString count] >= maxNoOfDigitsAfterDecimal)
    {
        NSString *sepStr = [NSString stringWithFormat:@"%@",[arrayOfString objectAtIndex:1]];
        return !([sepStr length] > maxNoOfDigitsAfterDecimal);
    }
    
    
    return YES;
    

    }

    【讨论】:

      【解决方案2】:

      首先,在每个步骤中添加日志记录以查看发生了什么,或进行调试。

      问题在于您正在修改字符串(以创建 newString 变量)。然后将句点添加到末尾并将其设置为文本字段的新值。然后你返回是(你后面的检查不使用新的文本字段值)。所以你添加“8”和句号,然后让框架添加“8”。

      【讨论】:

        猜你喜欢
        • 2014-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 2018-11-14
        • 1970-01-01
        相关资源
        最近更新 更多