- (NSString *)stringWithFormat:(NSString *)format andArguments:(NSArray *)arguments {
NSMutableString *result = [NSMutableString new];
NSArray *components = format ? [format componentsSeparatedByString:@"%@"] : @[@""];
NSUInteger argumentsCount = [arguments count];
NSUInteger componentsCount = [components count] - 1;
NSUInteger iterationCount = argumentsCount < componentsCount ? argumentsCount : componentsCount;
for (NSUInteger i = 0; i < iterationCount; i++) {
[result appendFormat:@"%@%@", components[i], arguments[i]];
}
[result appendString:[components lastObject]];
return iterationCount == 0 ? [result stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] : result;
}
Проверено с форматом и аргументами:
NSString *format = @"xxx=%@, yyy=%@ last component";
NSArray *arguments = @[@"XXX", @"YYY", @"ZZZ"];
Результат: xxx = XXX, yyy = YYY последний компонент
NSString *format = @"xxx=%@, yyy=%@ last component";
NSArray *arguments = @[@"XXX", @"YYY"];
Результат: xxx = XXX, yyy = YYY последний компонент
NSString *format = @"xxx=%@, yyy=%@ last component";
NSArray *arguments = @[@"XXX"];
Результат: xxx = XXX последний компонент
NSString *format = @"xxx=%@, yyy=%@ last component";
NSArray *arguments = @[];
Результат: последний компонент
NSString *format = @"some text";
NSArray *arguments = @[@"XXX", @"YYY", @"ZZZ"];
Результат: некоторый текст
Я думаю, что лучшим решением будет установить требуемый масштаб при делении: в этом случае возможно 2.
BigDecimal hundred = new BigDecimal(100);
BigDecimal percentage = new BigDecimal(20);
BigDecimal value = new BigDecimal(500);
BigDecimal percentageFactor =
percentage.divide(hundred,2, BigDecimal.ROUND_HALF_UP);
value = value.multiply(percentageFactor);
System.out.println("final value:"+ value);
конечное значение 100,00
(Умножение использует масштаб из коэффициентов ( 0 + 2), но это тоже можно указать.)
Я бы использовал HALF_UP для учета (в моем законодательстве) или EVEN (для статистики) для режима округления.
Масштаб нового BigDecimal ("20")
равен нулю, потому что у вас нет десятичной точки. Это означает, что ваш процент.divide (100, BigDecimal.ROUND_FLOOR)
даст ноль (фактически int (20/100)
или 0
).
Если вы действительно хотите работать с дробными числами, используйте new BigDecimal ("20.00")
, чтобы масштаб был установлен правильно, или используйте один из других конструкторов, чтобы задать масштаб специально.
Вот результат с этого простого изменения 20
на 20.00
, в комплекте с ошибкой в написании: -)
factor:0.20
final falue:100.00
Float Value:100.0
вы, вероятно, захотите использовать ROUND_UP в качестве режима округления
float имеет только 6 цифр точности и почти никогда не является хорошим выбором, я бы посоветовал вам использовать вместо него double. (или BigDecimal в некоторых случаях может быть лучше)