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

在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;
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 《裕语言》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 27,582评论 5 19
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,908评论 25 708
  • 家里没有拆迁之前,有一个很大的院子。我也是在失去了这个院子之后才意识到有个院子是件多么美好的事情。 爸爸会在院子里...
    abigsmile阅读 228评论 0 0
  • 在你的房子里,住着一个你看不到的你,你们永远也不会相遇。但那个你就在你身边,你们的命运可以自由发展,除了唯一一条准...
    薛志轩阅读 206评论 0 0
  • xcode版本升级到8已经很久了,很多像我一样的新手怕把自己的xcode版本升级到8。 其实升级到xcode8要兼...
    iOS_开发阅读 873评论 0 0