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

Mic*_*iZH 1 localization objective-c nsnumberformatter ios

我的十进制数存储在我的数据库中.我根据用户的区域设置显示它们:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

我在文本字段中显示这些字符串,这些字符串是可编辑的.因此,如果用户开始编辑该字段,我想删除千位分隔符.否则(在我的国家)我输入1'000.55然后它不识别"'"并仅保存1.这是我的功能来解析文本字段,在视图控制器中这个确切的返回值将保存到数据库:

+ (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];
    }
Run Code Online (Sandbox Code Playgroud)

但是,我没有让它工作......实际上,如果带有"'"和不带的数字将被正确保存,但我不能让它工作,那将是最好的:/

编辑(我的解决方案): 让它像这样工作:

- (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];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

现在正确解释每个字符串.1'000和1000和1000.00现在都是1000 :-)

jki*_*jki 6

我认为最简单,最干净的解决方案是:

NSLocale *locale = [NSLocale currentLocale];
NSString *thousandSeparator = [locale objectForKey:NSLocaleGroupingSeparator];
NSString *result = [decimalStringWithThousandSeperator stringByReplacingOccurrencesOfString:thousandSeparator withString:@""];
Run Code Online (Sandbox Code Playgroud)


mon*_*ote 5

在您的实例上设置usesGroupingSeparatorNO(或false在 Swift 中)NSNumberFormatter

它保留小数点分隔符,同时删除其余的分组分隔符。