iOS 中UITextField金額輸入限制(類似紛享銷客的年度目標(biāo))

金額輸入限制(小數(shù)點后兩位+最多不超過10億)

代碼:
初始化


        _moneyTextField = [[UITextField alloc] init];
        _moneyTextField.font = [UIFont systemFontOfSize:14];
        _moneyTextField.placeholder = @"請?zhí)顚懩繕?biāo)";
        _moneyTextField.textColor = UIColorHex(5C5C5C);
        _moneyTextField.borderStyle = UITextBorderStyleNone;
        _moneyTextField.textAlignment = NSTextAlignmentLeft;
        _moneyTextField.keyboardType = UIKeyboardTypeDecimalPad;
        [self.contentView addSubview:_moneyTextField];
        _moneyTextField.delegate = self;
        [_moneyTextField addTarget:self action:@selector(textfieldTextDidChange:) forControlEvents:UIControlEventEditingChanged];
        [_moneyTextField addTarget:self action:@selector(textfieldEditingDidBegin:) forControlEvents:UIControlEventEditingDidBegin];
        [_moneyTextField addTarget:self action:@selector(textfieldEditingDidEnd:) forControlEvents:UIControlEventEditingDidEnd];
/**
 金額的判斷,不超過十億+小數(shù)點后兩位
 */
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == _moneyTextField) {
        NSScanner      *scanner    = [NSScanner scannerWithString:string];
        NSCharacterSet *numbers;
        NSRange         pointRange = [textField.text rangeOfString:@"."];
        
        if ((pointRange.length > 0) && (pointRange.location < range.location  || pointRange.location > range.location + range.length)) {
            numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
        } else {
            numbers = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
        }
        
        if ([textField.text isEqualToString:@""] && [string isEqualToString:@"."] ) {
            return NO;
        }
        
        short remain = 2; //默認(rèn)保留2位小數(shù)
        
        NSString *tempStr = [textField.text stringByAppendingString:string];  // 原來的字符+當(dāng)前輸入的字符
        NSUInteger strlen = [tempStr length];
        if(pointRange.length > 0 && pointRange.location > 0) { //判斷輸入框內(nèi)是否含有“.”。
            if([string isEqualToString:@"."]) { //當(dāng)輸入框內(nèi)已經(jīng)含有“.”時,如果再輸入“.”則被視為無效。
                return NO;
            }
            if(strlen > 0 && (strlen - pointRange.location) > remain+1) { //當(dāng)輸入框內(nèi)已經(jīng)含有“.”,當(dāng)字符串長度減去小數(shù)點前面的字符串長度大于需要要保留的小數(shù)點位數(shù),則視當(dāng)次輸入無效。
                return NO;
            }
        }
        
        NSRange zeroRange = [textField.text rangeOfString:@"0"];
        if(zeroRange.length == 1 && zeroRange.location == 0){ //判斷輸入框第一個字符是否為“0”
            if(![string isEqualToString:@"0"] && ![string isEqualToString:@"."] && [textField.text length] == 1){ //當(dāng)輸入框只有一個字符并且字符為“0”時,再輸入不為“0”或者“.”的字符時,則將此輸入替換輸入框的這唯一字符。
                textField.text = string;
                return NO;
            }else{
                if(pointRange.length == 0 && pointRange.location > 0){ //當(dāng)輸入框第一個字符為“0”時,并且沒有“.”字符時,如果當(dāng)此輸入的字符為“0”,則視當(dāng)此輸入無效。
                    if([string isEqualToString:@"0"]){
                        return NO;
                    }
                }
            }
        }
        
        NSString *buffer;
        if ( ![scanner scanCharactersFromSet:numbers intoString:&buffer] && ([string length] != 0) )
        {
            return NO;
        }
        // 大于10億的時候不能再編輯
        if ([tempStr longLongValue] >= 1000000000) {
            return NO;
        }
    }
    return YES;
}

- (void)textfieldEditingDidBegin:(UITextField *)textField
{
    if ([textField.text containsString:@"元"]) {
        textField.text = [textField.text stringByReplacingOccurrencesOfString:@"元" withString:@""];
    }
    if ([textField.text containsString:@","]) {
        textField.text = [textField.text stringByReplacingOccurrencesOfString:@"," withString:@""];
    }
}

- (void)textfieldEditingDidEnd:(UITextField *)textField
{
    textField.text = [NSString stringWithFormat:@"%@元", [NSString balanceFormatFromStr:[NSString stringWithFormat:@"%.2f", [textField.text doubleValue]]]];
}

用到的NSString的分類

/**
 *  格式化每三位帶逗號的數(shù)據(jù)
 *  @param string 余額數(shù)據(jù)字符串
 *  @return 帶逗號余額
 */
+ (NSString *)balanceFormatFromStr:(NSString*)string
{

    NSNumberFormatter *numFormatter = [[NSNumberFormatter alloc] init];
    [numFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    NSNumberFormatter *numFormatter2 = [[NSNumberFormatter alloc] init];
    [numFormatter2 setNumberStyle:NSNumberFormatterNoStyle];
    NSNumber *num = [numFormatter2 numberFromString:string];
    NSString *tempStr = [numFormatter stringFromNumber:num];
    NSString *balanceStr = [tempStr substringFromIndex:1];
    if ([tempStr hasPrefix:@"-"]) {
        balanceStr = [NSString stringWithFormat:@"-%@",[tempStr substringFromIndex:2]];
    }
    return balanceStr;
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,881評論 25 709
  • 四行代碼搞定金額輸入限制 做支付的時候,不免要進行金額、價格的輸入,但在輸入的時候,如果可以實現(xiàn)相應(yīng)的限制,使其只...
    怪氣閱讀 2,968評論 3 4
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,602評論 30 472
  • 作為一名即將進入職場的應(yīng)屆畢業(yè)生,古典老師的這篇文章非常有實操性。首先,老師提出策略:資源策略與愿景策略,而資源策...
    mini享閱讀 378評論 0 0
  • 五月份。究竟是五月的第幾天,我無法想清了,只記得那天晚上,是我倆第一次照面。 暑氣剛剛開始的時候,花兒也在堅持怒放...
    穗沫閱讀 404評論 0 0

友情鏈接更多精彩內(nèi)容