iOS专题程序员iOS Developer

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

2016-05-21  本文已影响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;
}

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

上一篇下一篇

猜你喜欢

热点阅读