iOS:删除NSDecimalNumber中的千位分隔符以进行编辑

我有十进制数字存储在我的数据库中。 我根据用户的区域显示它们:

- (NSString *) getLocalizedCurrencyStringWithDigits { NSNumberFormatter *numberFormatter =[[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; [numberFormatter setLocale:[NSLocale currentLocale]]; [numberFormatter setMinimumFractionDigits:2]; [numberFormatter setMaximumFractionDigits:2]; NSString *numberString = [numberFormatter stringFromNumber:self]; return numberString; } 

我在可编辑的文本框中显示这些string。 所以如果用户开始编辑字段,我想删除千位分隔符。 否则(在我的国家),我input1'000.55,然后它不能识别“'”,只保存一个1.这是我的function来parsing文本字段,并在视图控制器这个确切的返回值将被保存到数据库:

 + (NSDecimalNumber *) getUnLocalizedDecimalNumberWithString:(NSString *)currencyString { NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; [numberFormatter setLocale:[NSLocale currentLocale]]; [numberFormatter setMinimumFractionDigits:2]; [numberFormatter setMaximumFractionDigits:2]; BOOL isDecimal = [numberFormatter numberFromString:currencyString] != nil; if(isDecimal){ return [NSDecimalNumber decimalNumberWithString:currencyString locale:[NSLocale currentLocale]]; } else { return [NSDecimalNumber zero]; } 

然而,我不明白它的工作…实际上最好是如果数字与“'”和没有将被正确保存,但我不明白它的工作:/

编辑(我的解决scheme):得到它的工作是这样的:

 - (NSString *) getLocalizedCurrencyStringWithDigits:(int)digits { NSNumberFormatter *numberFormatter =[[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; [numberFormatter setLocale:[NSLocale currentLocale]]; [numberFormatter setMinimumFractionDigits:digits]; [numberFormatter setMaximumFractionDigits:digits]; NSString *numberString = [numberFormatter stringFromNumber:self]; return numberString; } + (NSDecimalNumber *) getUnLocalizedDecimalNumberWithString:(NSString *)currencyString { NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; [numberFormatter setLocale:[NSLocale currentLocale]]; [numberFormatter setMinimumFractionDigits:2]; [numberFormatter setMaximumFractionDigits:2]; NSNumber *formatedCurrency = [numberFormatter numberFromString:currencyString]; BOOL isDecimal = formatedCurrency != nil; if(isDecimal){ return [NSDecimalNumber decimalNumberWithDecimal:[formatedCurrency decimalValue]]; } else { return [NSDecimalNumber zero]; } } 

+(NSDecimalNumber *)getUnLocalizedDecimalNumberWithString:(NSString *)currencyString

现在解释每一个string正确。 1'000和1000和1000.00现在都是1000 🙂

我认为最简单和最干净的解决scheme是:

 NSLocale *locale = [NSLocale currentLocale]; NSString *thousandSeparator = [locale objectForKey:NSLocaleGroupingSeparator]; NSString *result = [decimalStringWithThousandSeperator stringByReplacingOccurrencesOfString:thousandSeparator withString:@""]; 

我看到你的代码有几个问题,也不清楚你想要做什么。

第一个问题是在你的方法getLocalizedCurrencyStringWithDigits中,你调用了stringFromNumber并传入“self”。 这是没有道理的,除非你正在创buildNSNumber的自定义子类,我怀疑你正在做什么。

接下来的问题是你正在使用的NSDecimalNumber类,我怀疑是不是你所想的那样。 它是NSNumber的一个特殊的子类,它被devise用来做10math运算而没有使用二进制算术对小数进行math运算的舍入误差。 NSDecimalNumber是一个非常专业的类,除非你确切地知道你为什么使用它,这不是你所需要的。 只需使用常规的NSNumber。

接下来的问题。 你说你正试图“删除千位分隔符”。 几千个分隔符? 如果将数字值转换为string,则应该使用用户语言环境的正确格式。 另外,为什么你使用NSNumberFormatterDecimalStyle如果你想显示的是货币金额? 你不应该使用NSNumberFormatterCurrencyStyle吗?

从这个答案中 ,删除所有不是数字或小数的字符,并且当使用NSNumberFormatterfloatValue转换时,您应该只使用有效数字来获得一个被剥离的string

 NSScanner *scanner = [NSScanner scannerWithString:originalString]; NSCharacterSet *numbers = [NSCharacterSet characterSetWithCharactersInString:@".0123456789"]; while ([scanner isAtEnd] == NO) { NSString *buffer; if ([scanner scanCharactersFromSet:currencyString intoString:&buffer]) { [strippedString appendString:buffer]; } else { [scanner setScanLocation:([scanner scanLocation] + 1)]; } } 

或者你可以使用正则expression式:

 NSString * strippedNumber = [currencyString stringByReplacingOccurrencesOfRegex:@"^([0-9]+)?(\\.([0-9]{1,2})?)?$" withString:@""]; 

我不能用这里使用的正则expression式语法发誓,因为我从这里偷东西 。 我在那里没有太多的经验。