2024年3月26日发(作者:)

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

=[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=[

rangeOfString:@"."].location;

if(NSNotFound==nDotLoc&&0!=on)

{

cs=[[NSCharacterSet

characterSetWithCharactersInString:myNumbers]invertedSet];

if([string isEqualToString:@"."])

{

return YES;

}

if(>=dotPreBits)

{//小数点前面6位

//[textField resignFirstResponder];

[DCFStringUtil showNotice:[NSString stringWithFormat:@"

只允许小数前%d位",dotPreBits]];

return NO;

}

}

else

{

cs=[[NSCharacterSet

characterSetWithCharactersInString:myDotNumbers]invertedSet

];

if(>=dotPreBits+dotAfterBits+1)

{

[textField resignFirstResponder];

[DCFStringUtil showNotice:[NSString stringWithFormat:@"

只允许小数点后%d位",dotAfterBits]];

return NO;

}

}

NSString*filtered=[[string

componentsSeparatedByCharactersInSet:cs]componentsJoinedByS

tring:@""];

BOOL basicTest=[string isEqualToString:filtered];

if(!basicTest)

{

[textField resignFirstResponder];

[DCFStringUtil showNotice:[NSString stringWithFormat:@"

只允许小数点后%d位",dotAfterBits]];

return NO;

}

if(NSNotFound!=nDotLoc&&on>nDotLoc+2)

{//小数点后面两位

[textField resignFirstResponder];

[DCFStringUtil showNotice:[NSString stringWithFormat:@"

只允许小数点后%d位",dotAfterBits]];

return NO;

}

return YES;

}