美文网首页iOS专题程序员iOS Developer
iOS金额输入控制及金额精确计算

iOS金额输入控制及金额精确计算

作者: 仁伯 | 来源:发表于2016-05-21 19:15 被阅读2738次
    在APP设计中,货币金额计算经常用到,但经常会遇到四舍五入问题,比如在输入框中输入99999999.99的时候,在计算和之后,得到的值不匹配,比如99999999.99 * 2 = 2000000000.00这样的问题。

    通常做法如下:

       NSString *count = 2;// 物品数量
       NSString *price = @"999999999.99"; // 物品单价
       NSString *singleTotlePrice = [NSString stringWithFormat:@"%.2f", (double)[price doubleValue]];
      double total = [count doubleValue] * [singleTotlePrice doubleValue];
      NSLog(@"%.2f",total); // 保留两位  199999999.98
      singleTotalPriceTextLab.text = [NSString stringWithFormat:@"小计(元):¥%.2lf",total];
    
    输入控制部分,比如输入小数点前8位,小数点后2位,只需在UITextField的代理方法中调用工具方法即可,实现如下:
    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
      {
             // 实际付款金额位数限制,小数点前是 8为整数,小数点后2位
             return [DCFCustomExtra limitPayMoneyDot:textField shouldChangeCharactersInRange:range replacementString:string dotPreBits:8 dotAfterBits:2];
      }
    
     /**
     *  付款金额限制代码
     *
     *  @param textField    当前textField
     *  @param range        range
     *  @param string       string
     *  @param dotPreBits   小数点前整数位数
     *  @param dotAfterBits 小数点后位数
     *
     *  @return shouldChangeCharactersInRange 代理方法中 可以限制金额格式
     */
    
    + (BOOL) limitPayMoneyDot:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string dotPreBits:(int)dotPreBits dotAfterBits:(int)dotAfterBits
    
    {
        if ([string isEqualToString:@"\n"]||[string isEqualToString:@""])
        { //按下return
            return YES;
        }
    
         NSCharacterSet *cs;
         NSUInteger nDotLoc = [textField.text rangeOfString:@"."].location;
         if (NSNotFound == nDotLoc && 0 != range.location)
         {
             cs = [[NSCharacterSet characterSetWithCharactersInString:myNumbers]invertedSet];
             if ([string isEqualToString:@"."])
             {
                 return YES;
             }
             if (textField.text.length >= dotPreBits)
             {  //小数点前面6位
                // [textField resignFirstResponder];
                 [DCFStringUtil showNotice:[NSString stringWithFormat:@"只允许小数前%d位", dotPreBits]];
                  return NO;
              }
           }
            else
           {
                cs = [[NSCharacterSet characterSetWithCharactersInString:myDotNumbers]invertedSet];
                if (textField.text.length >= dotPreBits + dotAfterBits + 1)
                {
                      [textField resignFirstResponder];
                       [DCFStringUtil showNotice:[NSString stringWithFormat:@"只允许小数点后%d位", dotAfterBits]];
                       return  NO;
                }
           }
           NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
           BOOL basicTest = [string isEqualToString:filtered];
           if (!basicTest)
           {
               [textField resignFirstResponder];
               [DCFStringUtil showNotice:[NSString stringWithFormat:@"只允许小数点后%d位", dotAfterBits]];
                return NO;
            }
           if (NSNotFound != nDotLoc && range.location > nDotLoc +2)
           {  //小数点后面两位
                 [textField resignFirstResponder];
                 [DCFStringUtil showNotice:[NSString stringWithFormat:@"只允许小数点后%d位", dotAfterBits]];
                 return NO;
            }
        return YES;
    }
    

    本文已在版权印备案,如需转载请在版权印获取授权。
    获取版权

    相关文章

      网友评论

      • 问问问你:小数点个数没有做限制。可以输入多个小数点
      • 换个态度吧:因为涉及到钱计算,一直精度出现问题
      • 换个态度吧:对于精度不准确你遇见过嘛?比如 nsstring是8.56 转成double 就成了8.555555555 如果是取两位的话 就成了8.55。像这样情况怎么处理,我现在处理方式是 nsstring转double 先加上0.005,但是这么做我感觉不合适

      本文标题:iOS金额输入控制及金额精确计算

      本文链接:https://www.haomeiwen.com/subject/bzkorttx.html