2015-09-17 43 views
0

我對textfield有問題。這種情況在英語語言中可以正常工作。但是,如果設備語言更改爲法語(加拿大),則文本字段不會顯示小數點後的值。如何使用NSNumber獲取法語設備的十進制值?

英語:

I enter 99.99 and click Done. The text field display 99.99 

法國:

I enter 99,99 and click Done . The text field display 99,00 

這裏是我的代碼:

_amountField.text = [_amountField currencyFormatFromValue:[NSNumber numberWithDouble:_amountField.text.doubleValue]]; 

這裏[NSNumber numberWithDouble:_amountField.text.doubleValue]部分是在英語和99的情況下返回99.99, 00在法國的情況下

-(NSString *)currencyFormatFromValue:(NSNumber *)value{ 

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 

    formatter.positiveFormat = @"###.00"; 
    formatter.roundingMode = NSNumberFormatterRoundFloor; 
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
    NSString *groupingSeparator = [[NSLocale currentLocale] objectForKey:NSLocaleGroupingSeparator]; 
    [formatter setGroupingSeparator:groupingSeparator]; 
    [formatter setUsesGroupingSeparator:YES]; 
    [formatter setCurrencySymbol:@""]; 
    [formatter setMinimumIntegerDigits:1]; 
    NSString *formattedValue = [formatter stringFromNumber:value]; 

    return formattedValue; 
} 

我不確定,爲什麼在double中轉換的法語文本是終止小數值。有任何想法嗎?

在將值發送給格式化程序之前,是否需要將文本轉換回英文?

+1

你不應該設置任何比其他款式的數量格式的屬性。讓用戶的區域設置定義其他所有內容。 – rmaddy

+0

我用分組分隔符來分隔總數值中的數百和數千。如果我只是使用數字樣式,它不會分隔數百和數千 –

+1

只需使用'setUsesGroupingSeparator:'打開分組。你不應該設置實際的分隔符。 – rmaddy

回答

1

我認爲你的positiveFormat規範與期限是衝突NSNumberFormatterCurrencyStyle。我想嘗試註釋掉一堆線並重新編譯:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 

// formatter.positiveFormat = @"###.00"; 
// formatter.roundingMode = NSNumberFormatterRoundFloor; 
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
// NSString *groupingSeparator = [[NSLocale currentLocale] objectForKey:NSLocaleGroupingSeparator]; 
// [formatter setGroupingSeparator:groupingSeparator]; 
// [formatter setUsesGroupingSeparator:YES]; 
// [formatter setCurrencySymbol:@""]; 
// [formatter setMinimumIntegerDigits:1]; 
NSString *formattedValue = [formatter stringFromNumber:value]; 

return formattedValue; 

以我的經驗,格式化開箱將再次包括分組分隔符,貨幣符號,舍入模式等指定它可能混淆格式化。

如果你真的需要明確指定了積極的格式,你可以嘗試使用NSLocaleDecimalSeparator常數,使得這將是一個週期或逗號作爲需要建立積極的格式字符串:

NSString *decimalSeparator = [[NSLocale currentLocale] objectForKey:NSLocaleDecimalSeparator]; 
formatter.positiveFormat = [NSString stringWithFormat:@"###%@00", decimalSeparator]; 

但我不要推薦它!

+0

我需要這樣做,因爲如果我不輸入任何十進制值,我需要在最後加.00。 –

+0

修改爲包含替代值,但是我真的很驚訝,默認值不處理其中的.00和00。擁有。 –

+0

不要這樣做。默認情況下,數字格式化程序將根據用戶的區域設置使用正確的格式。 – rmaddy

0

我找到了一種使它工作的方法。我需要刪除文本字段中出現的法文字符併發送給格式化程序。

_amountField.text = [_amountField currencyFormatFromValue:[NSNumber numberWithDouble:[_amountField.text strippedAmount]doubleValue]]; 

//macro 

#define IsFrenchLanguage() ([[[NSLocale preferredLanguages] objectAtIndex:0] rangeOfString:@"fr"].location != NSNotFound) 

-(NSString *) strippedAmountString 
{ 
    NSString * thousandsSeparator = IsFrenchLanguage() ? @" " : @","; 
    return [self.amountField.text stringByReplacingOccurrencesOfString:thousandsSeparator withString:@""]; 
}