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


发布评论