2015-09-17 6 views
0

У меня проблема с текстовым полем. Этот случай отлично работает с английским языком. Однако, если язык устройства изменяется на французский (canada), текстовое поле не показывает значения после десятичного числа.Как получить десятичные значения, когда устройство находится на французском языке с использованием 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

Я использовал groupingseparator для разделения сотен и тысяч в общей стоимости. Если я просто использую стиль номера, он не разделяет сотни и тысячи –

+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:@""]; 
}