2014-01-27 53 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:@""];