2014-01-27 38 views
0

我的十进制数以十进制形式存储在我的数据库中。我根据用户的语言环境显示它们: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; 
} 

而且我在可编辑的文本字段中显示这些字符串。所以如果用户开始编辑字段,我想删除千位分隔符。否则(在我的国家),我输入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现在:-)

+0

如果你解决你自己的问题,你应该张贴的溶液,作为一个答案,然后接受它(一旦系统可以让你)。 – Almo

+0

是的,首先我想,但是我想先看看我的解决方案是否可以。我的意思是如果我失去了任何精度,首先将字符串转换为NSNumber,然后再转换为NSDecimalNumber。或者如果我创建了太多的对象...我仍然在学习每行代码:) – MichiZH

回答

-1

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

转换时,你应该得到一个剥离字符串只有一个有效的数字
NSScanner *scanner = [NSScanner scannerWithString:originalString]; 
NSCharacterSet *numbers = [NSCharacterSet 
     characterSetWithCharactersInString:@"."]; 

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正则表达式语法发誓。我在那里没有太多经验。

+1

这很危险,因为它不考虑用户的语言环境。例如,德语字符串“1.000,80”将变成“1.0008”,失去正确的小数点。 – nschum

0

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

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

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

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

+0

1.是的,这就是我正在做的,这是一个关于NSDecimalNumber的类别 2.我使用NSDecimalNumber,因为我正在处理货币并且需要确切的值 3.我使用十进制样式,因为我不需要任何货币符号像$或其他。在我的字符串中,我从我的方法中得到了一个千位分隔符,并且解析不能识别它... – MichiZH

+0

NSNumber是一个类集群。对属于类集群一部分的对象进行子类化有特殊要求。您是否知道为类集群的成员进行子类化所需的特殊步骤? –

+0

你需要给你的读者一个更完整的照片,你正在做什么。我们需要知道你发布的代码是NSDecimalNumber的一个自定义子类的一部分。你应该概述一下你的这个特殊的子类的目标是什么,以及你添加的方法,以及你如何处理你是一个类集群成员的子类。 –

5

我相信最简单,最干净的解决方案是这样的:

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