在APP設(shè)計中贪婉,貨幣金額計算經(jīng)常用到,但經(jīng)常會遇到四舍五入問題卢肃,比如在輸入框中輸入99999999.99的時候疲迂,在計算和之后,得到的值不匹配莫湘,比如99999999.99 * 2 = 2000000000.00這樣的問題尤蒿。
通常做法如下:
NSString *count = 2;// 物品數(shù)量
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];
輸入控制部分,比如輸入小數(shù)點前8位逊脯,小數(shù)點后2位优质,只需在UITextField的代理方法中調(diào)用工具方法即可,實現(xiàn)如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
// 實際付款金額位數(shù)限制,小數(shù)點前是 8為整數(shù)巩螃,小數(shù)點后2位
return [DCFCustomExtra limitPayMoneyDot:textField shouldChangeCharactersInRange:range replacementString:string dotPreBits:8 dotAfterBits:2];
}
/**
* 付款金額限制代碼
*
* @param textField 當(dāng)前textField
* @param range range
* @param string string
* @param dotPreBits 小數(shù)點前整數(shù)位數(shù)
* @param dotAfterBits 小數(shù)點后位數(shù)
*
* @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)
{ //小數(shù)點前面6位
// [textField resignFirstResponder];
[DCFStringUtil showNotice:[NSString stringWithFormat:@"只允許小數(shù)前%d位", dotPreBits]];
return NO;
}
}
else
{
cs = [[NSCharacterSet characterSetWithCharactersInString:myDotNumbers]invertedSet];
if (textField.text.length >= dotPreBits + dotAfterBits + 1)
{
[textField resignFirstResponder];
[DCFStringUtil showNotice:[NSString stringWithFormat:@"只允許小數(shù)點后%d位", dotAfterBits]];
return NO;
}
}
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
BOOL basicTest = [string isEqualToString:filtered];
if (!basicTest)
{
[textField resignFirstResponder];
[DCFStringUtil showNotice:[NSString stringWithFormat:@"只允許小數(shù)點后%d位", dotAfterBits]];
return NO;
}
if (NSNotFound != nDotLoc && range.location > nDotLoc +2)
{ //小數(shù)點后面兩位
[textField resignFirstResponder];
[DCFStringUtil showNotice:[NSString stringWithFormat:@"只允許小數(shù)點后%d位", dotAfterBits]];
return NO;
}
return YES;
}
本文已在版權(quán)印備案演怎,如需轉(zhuǎn)載請在版權(quán)印獲取授權(quán)。
獲取版權(quán)