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

时间:2014-01-27 19:49:56

标签: ios objective-c localization nsnumberformatter

我的十进制数字存储在我的数据库中。然后我根据用户的语言环境显示它们:

- (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;
}

我在文本字段中显示这些字符串,这些字符串是可编辑的。因此,如果用户开始编辑该字段,我想删除千位分隔符。否则(在我的国家)我输入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];
    }

但是我没有让它发挥作用...实际上,如果带有“'”和不带的数字将被正确保存但我不能让它起作用最好:/

编辑(我的解决方案): 得到这样的工作:

- (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

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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

我发现你的代码存在一些问题,我也不清楚你想要做什么。

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

接下来的问题是你使用的是NSDecimalNumber类,我怀疑它不是你认为的那样。它是NSNumber的一个特殊子类,用于进行基数10数学运算而不会出现使用二进制算法对小数进行数学运算的舍入误差。 NSDecimalNumber是一个非常专业的类,除非你确切知道为什么使用它,否则它不是你需要的。只需使用常规的NSNumber即可。

然后是下一个问题。你说你试图“删除千位分隔符”。什么千分隔?如果将数字值转换为字符串,则它应该采用用户区域设置的正确格式。另外,为什么使用NSNumberFormatterDecimalStyle如果要显示的是货币金额?你不应该使用NSNumberFormatterCurrencyStyle吗?

答案 2 :(得分:0)

在您的usesGroupingSeparator实例上将NSNumberFormatter设置为NO(或在Swift中为false)。

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

答案 3 :(得分:-1)

From this answer,删除所有不是数字或小数的字符,在使用NSNumberFormatterfloatValue

进行转换时,您应该获得一个只有有效数字的剥离字符串
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)];
  }
}

或者您可以使用正则表达式:

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

我不能发誓这里使用的正则表达式语法I stole if from here。我没有那么多经验。