2013-07-23 2 views
0

Я использую следующий NSNumberFormatter для добавления запятых и символа в значение валюты.iOS: NSNumberFormatter не преобразовывает строку обратно в NSNumber

self.currencyFormatter = [NSNumberFormatter new]; 
self.currencyFormatter.numberStyle = NSNumberFormatterCurrencyStyle; 
self.currencyFormatter.currencySymbol = @"£"; 
self.currencyFormatter.currencyCode = @"GBP"; 
self.currencyFormatter.roundingMode = NSNumberFormatterRoundHalfUp; 
self.currencyFormatter.maximumFractionDigits = 0; 

Использование:

self.principleAmountTextField.text = [self.currencyFormatter stringFromNumber:[NSNumber numberWithInteger:100000]]; 

Это отображает 100 000 £, как и ожидалось. Теперь, если я вставляю еще две цифры (текст становится £ 100 00096) в текстовом поле и пытаюсь преобразовать строку в Integer, я получаю 0! В основном следующая строка возвращает 0. Я понятия не имею, как справиться с этой проблемой.

NSLog(@"%d", [[self.currencyFormatter numberFromString:@"£100,00096"] integerValue]); 

FYI У меня есть пользовательское inputview для текстового поля, которое просто позволяет номерам вводить текстовое поле. В Did Edit End даже я отформатирую номер и покажу с запятой.

+0

'£ 100,00096' - недействительный номер. '£ 10,000,096' было бы так же, как' 10000096'. – rmaddy

+0

.... но я не могу поместить запятые, когда пользователь вводит номер! Есть ли в любом случае номера, которые автоматически преобразуются в требуемый формат, как введенные? – applefreak

+0

Если пользователь может ввести недопустимое значение, вам нужно будет удалить любые символы группировки из строки, прежде чем пытаться ее преобразовать. – rmaddy

ответ

1

Вы должны удалить запятые для этой работы, вы можете показать их в текстовом поле, но вы должны лишить их, прежде чем передать строку в форматере. Что-то вроде этого:

NSString *userInput = @"£100,00096";  
userInput = [userInput stringByReplacingOccurrencesOfString:@"," withString:@""]; 
NSLog(@"%ld", (long)[[currencyFormatter numberFromString:userInput] integerValue]); 
+1

Не вставляйте в код кодовые запятые. На основе локали пользователя могут использоваться разные символы. Было бы лучше получить символ группировки из числа форматировщиков чисел. – rmaddy

+0

Хорошая точка rmaddy! Я исправлю это – Lance

0

100,00096 не правильно ...

ли вы имеете в виду один из них?

[[self.currencyFormatter numberFromString:@"£10000096"] integerValue] 
[[self.currencyFormatter numberFromString:@"£100,000.96"] integerValue] 
[[self.currencyFormatter numberFromString:@"£100000.96"] integerValue] 
[[self.currencyFormatter numberFromString:@"£10,000,096"] integerValue] 
+0

... нет, когда пользователь вводит номер, который они просто добавляют. Например, у вас уже есть 100 000 фунтов стерлингов в текстовом поле. Теперь они начинают вводить номер, и он будет добавлен в размере 100 000 фунтов стерлингов + все, что было введено. Они могут просто вводить числа, а не запятые. В didEditEnd я являюсь номером форматирования. – applefreak

+1

Конечно, но тогда вам нужно переформатировать то, что вы показываете пользователю, когда они вводят числа. '100,00096' - неправильный способ отображения любого числа. – runmad

0

Мой последний код для справки. Число с символом валюты также недействительным! Следующее заботится обо всем.

NSCharacterSet *doNotWant = [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat:@"%@%@", self.currencyFormatter.groupingSeparator, self.currencyFormatter.currencySymbol]]; 
    self.amountTextField.text = [[self.amountTextField.text componentsSeparatedByCharactersInSet:doNotWant] componentsJoinedByString:@""]; 
    self.amountTextField.text = [NSString stringWithFormat:@"£%@", self.amountTextField.text]; 
    NSUInteger amount = [[self.currencyFormatter numberFromString:self.amountTextField.text] integerValue]; 
    self.amountTextField.text = [self.currencyFormatter stringFromNumber:[NSNumber numberWithInteger:amount]]