2019-10-21 10:25:11 RollingPin 阅读数 92
//两位整数
NSString * testStr_0 = [NSString stringWithFormat:@"%02d",1];
//两位小数
NSString * testStr_1 = [NSString stringWithFormat:@"%0.2f",1];
NSString * testStr_2 = [NSString stringWithFormat:@"%0.2f",0.666666];
//保留固定位小数时,会默认四舍五入
2016-12-16 15:08:28 zww1984774346 阅读数 1965

具体操作直接看代码了:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;
{ 
 //string就是此时输入的那个字符textField就是此时正在输入的那个输入框返回YES就是可以改变输入框的值NO相反
    NSString * toBeString = [textField.text     stringByReplacingCharactersInRange:range withString:string]; 
    // 判断是否输入内容,或者用户点击的是键盘的删除按钮
    if (![string isEqualToString:@""]) {
        if ([textField isEqual:self.textField]) {
            // 小数点在字符串中的位置 第一个数字从0位置开始
            NSInteger dotLocation = [textField.text rangeOfString:@"."].location;
            if (dotLocation == NSNotFound && range.location != 0) {
                //没有小数点,最大数值
                if (range.location >= 9){
                    NSLog(@"单笔金额不能超过亿位");
                    if ([string isEqualToString:@"."] && range.location == 9) {
                        return YES;
                    }
                    return NO;
                }
            }
            //判断输入多个小数点,禁止输入多个小数点
            if (dotLocation != NSNotFound){
                if ([string isEqualToString:@"."])return NO;
            }
            //判断小数点后最多两位
            if (dotLocation != NSNotFound && range.location > dotLocation + 2) { return NO; }
            //判断总长度
            if (textField.text.length > 11) {
                return NO;
            }
        }
    }
    return YES;
}
2015-05-19 15:05:16 Ehome_hong 阅读数 2109

有时候,我们项目中难免会用到textField输入小数的情况,而且规定小数点后最多输入多少位的问题。

下面我来展示一下最多输入两位小数的情况,(这个多少位小数,看需求,我这里讲的是2位小数)

还是直接看代码吧:

 textField.keyboardType = UIKeyboardTypeDecimalPad;
// A number pad with a decimal point.苹果给的注释就是一个带小数点的键盘

#pragma mark- UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField.keyboardType == UIKeyboardTypeDecimalPad) {
        if ([textField.text rangeOfString:@"."].location==NSNotFound) {
            isHaveDian=NO;
        }
        if ([string length]>0)
        {
            unichar single=[string characterAtIndex:0];//当前输入的字符
            if ((single >='0' && single<='9') || single=='.')//数据格式正确
            {
                //首字母不能为0和小数点
                if([textField.text length]==0){
                    if(single == '.'){
                        //                    [self alertView:@"亲,第一个数字不能为小数点"];
                        [textField.text stringByReplacingCharactersInRange:range withString:@""];
                        return NO;
                        
                    }
                }else if (textField.text.length == 1 && [textField.text isEqualToString:@"0"]){
                    if (single != '.') {
                        //                    [self alertView:@"亲,第一个数字不能为0"];
                        [textField.text stringByReplacingCharactersInRange:range withString:@""];
                        return NO;
                        
                    }
                }
                if (single=='.')
                {
                    if(!isHaveDian)//text中还没有小数点
                    {
                        isHaveDian=YES;
                        return YES;
                    }else
                    {
                        //                    [self alertView:@"亲,您已经输入过小数点了"];
                        [textField.text stringByReplacingCharactersInRange:range withString:@""];
                        return NO;
                    }
                }
                else
                {
                    if (isHaveDian)//存在小数点
                    {
                        //判断小数点的位数
                        NSRange ran=[textField.text rangeOfString:@"."];
                        NSInteger tt=range.location-ran.location;
                        if (tt <= 2){
                            return YES;
                        }else{
                            //                        [self alertView:@"亲,您最多输入两位小数"];
                            return NO;
                        }
                    }
                    else
                    {
                        return YES;
                    }
                }
            }else{//输入的数据格式不正确
                //            [self alertView:@"亲,您输入的格式不正确"];
                [textField.text stringByReplacingCharactersInRange:range withString:@""];
                return NO;
            }
        }
        else
        {
            return YES;
        }
    }
    return YES;
}



2016-08-10 09:55:00 liudan302698481 阅读数 11386

最近快被ios的四舍五入的问题给烦死了,不是说他的四舍五入不好用,而是这个四舍五入有时可能不是四舍五入,而是四舍六入。

先说一下我最后确定使用的方法:

-(float)roundFloat:(float)price{

    return (floorf(price*100 + 0.5))/100;

}

这个基本能够确保最后是四舍五入并且能保留两位小数。

下面再说说这个曲折的过程,首先我想到的是用ios里面自带的roud方法,

-(float)roundFloat:(float)price{

    return roundf(price);

}

但是如下举例

float test = 23.625;

float test2 = 23.6250;

float test3 = 23.6251;

test = [self roundFloat:test];

test2 = [self roundFloat:test2];

test3 = [self roundFloat:test3];

    

NSLog(@"test:%.2f",test);

NSLog(@"test2:%.2f",test2);

NSLog(@"test3:%.2f",test3);

得出结果:

test:24.00

test2:24.00

test3:24.00


很显然不是我想要的效果,然后改方法

-(float)roundFloat:(float)price{

    return roundf(price*100)/100;

}


这个方法貌似可用,但是之前我不知道造了什么数据,恍惚之间觉得它好像也有问题,再看另外一个方法


-(float)roundFloat:(float)price{

    NSString *temp = [NSString stringWithFormat:@"%.7f",price];

    NSDecimalNumber *numResult = [NSDecimalNumber decimalNumberWithString:temp];

    NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler

                                       decimalNumberHandlerWithRoundingMode:NSRoundBankers

                                       scale:2

                                       raiseOnExactness:NO

                                       raiseOnOverflow:NO

                                       raiseOnUnderflow:NO

                                       raiseOnDivideByZero:YES];

    return [[numResult decimalNumberByRoundingAccordingToBehavior:roundUp] floatValue];

}


用这个方法格式化上面的浮点数结果如下:

 test:23.62

 test2:23.62

 test3:23.63

可以看到test ,test2 没有做四舍五入,只有 test3 是四舍五入了,从数据上分析,不难发现,原因是test3里面的第三个小数位后面有一个1,而test及test2后面没有小数位或者为0,所以就没有进行四舍五入。




2016-03-22 18:48:39 u014696025 阅读数 2940

iOS限制文本框输入两位小数和最大值

  • 实际开发中,经常会遇到这样的场景:限制某个文本框输入的最大值和小数位数,具体实现方式有很多,我这里用的是正则+代理的方式实现,思路如下:

设置文本框代理

// 设置输入金额的文本框代理
self.txfAmount.delegate = self;

定义最大值的宏,方便以后修改

#define kMaxAmount 99999999

实现UITextFieldDelegate

#pragma mark - <UITextFieldDelegate>
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString *amountText = self.txfAmount.text;
    NSString *regStr = @"^([1-9][\\d]{0,100}|0)(\\.[\\d]{0,1})?$";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regStr];
    BOOL match = [predicate evaluateWithObject:amountText];
    if ([string isEqualToString:@""]) return YES;  // 始终允许用户删除
    NSString *tmpStr = [amountText stringByAppendingString:string];
    NSString *numStr = [[tmpStr componentsSeparatedByString:@"."] firstObject];
    NSInteger amount = [numStr integerValue];
    if (([amountText integerValue] == kMaxAmount) && (![string isEqualToString:@""])) return NO;
    BOOL result = [amountText isEqualToString:@""] ? YES : (match && ((amount <= kMaxAmount) || [string isEqualToString:@"."]));
    return result;
}

ios 小数点后两位

阅读数 3958

没有更多推荐了,返回首页