在购物车上进行的工作,总计商品的总价。

我有此字符串£4.44存储在核心数据中。

我使用以下代码从字符串中提取数字:

+ (float)totalPriceOfItems:(NSManagedObjectContext *)managedObjectContext
{
    NSError *error = nil;
    float totalPrice = 0;

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"BagItem"];

    // Get fetched objects and store in NSArray
    NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

    for (BagItem *bagItem in fetchedObjects) {
        NSString *price = [[[bagItem price] componentsSeparatedByCharactersInSet:
                            [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
                           componentsJoinedByString:@""];
        totalPrice = totalPrice + [price floatValue];

        NSLog(@"total: %f", totalPrice);
    }

    return totalPrice;
}


我取回这个值444.000000

当我的意图是回到4.44时

我很明显在这里遗漏了一些东西,也许将每个项目的价格存储为整数会更好,但是现在我想使事情以这种方式工作。

谢谢你的时间

最佳答案

问题可能出在您的解析代码上

[[[bagItem price] componentsSeparatedByCharactersInSet:
                        [[NSCharacterSet decimalDigitCharacterSet] invertedSet]]
                       componentsJoinedByString:@""]


您要做的是将不是数字的每个字符上的字符串分开,然后将其放回原处。因此,将字符串4.44拆分为小数点,然后放回到444处。我的建议是以不需使用任何解析代码的方式存储价格的方式-应该将其存储如4.44。

现在到下一个问题-浮动。浮动和双打在财务应用方面没有您需要的精度。在某个时候,您要将10.99和0.01加在一起,发现答案不是11.0而是11.000000000001或类似的东西。对于这些类型的情况,您应该将数字存储为NSDecimalNumber,并使用该类提供的函数进行计算。

您可以将字符串转换为NSDecimalNumber,如下所示:

[NSDecimalNumber decimalNumberWithString:@"44.50"];


通过使用NSDecimal数字,这也使您可以使用NSNumberFormatter将数字格式化为货币(如果要显示它)

[NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterCurrencyStyle];

关于ios - 从NSString对象返回的浮点值不是我期望的值,如何正确从NSString中提取浮点值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24598337/

10-10 07:22