Я нашел решение, и в соответствии с целью этого вопроса я собираюсь дать полный ответ тем, у кого эта проблема возникнет в будущем. Сначала я создал новый вспомогательный класс с именем NumberFormatting и создал два метода.
//
// NumberFormatting.h
// Created by Noah Hendrix on 12/26/09.
//
#import <Foundation/Foundation.h>
@interface NumberFormatting : NSObject {
}
-(NSString *)stringToCurrency:(NSString *)aString;
-(NSString *)decimalToIntString:(NSDecimalNumber *)aDecimal;
@end
и вот файл реализации:
//
// NumberFormatting.m
// Created by Noah Hendrix on 12/26/09.
//
#import "NumberFormatting.h"
@implementation NumberFormatting
-(NSString *)stringToCurrency:(NSString *)aString {
NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setGeneratesDecimalNumbers:YES];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
if ([aString length] == 0)
aString = @"0";
//convert the integer value of the price to a decimal number i.e. 123 = 1.23
//[currencyFormatter maximumFractionDigits] gives number of decimal places we need to have
//multiply by -1 so the decimal moves inward
//we are only dealing with positive values so the number is not negative
NSDecimalNumber *value = [NSDecimalNumber decimalNumberWithMantissa:[aString integerValue]
exponent:(-1 * [currencyFormatter maximumFractionDigits])
isNegative:NO];
return [currencyFormatter stringFromNumber:value];
}
-(NSString *)decimalToIntString:(NSDecimalNumber *)aDecimal {
NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setGeneratesDecimalNumbers:YES];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
if (aDecimal == nil)
aDecimal = [NSDecimalNumber zero];
NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithMantissa:[aDecimal integerValue]
exponent:([currencyFormatter maximumFractionDigits])
isNegative:NO];
return [price stringValue];
}
@end
Первый метод, stringToCurrency, возьмет целое число (в данном случае переданное из текстового поля) и преобразует его в десятичное значение, используя перемещение десятичной точки в соответствии с настройками языкового стандарта пользователя. Затем он возвращает строковое представление, отформатированное как валюта с использованием NSNumberFormatter.
Второй метод работает в обратном порядке, он принимает значение, подобное 1,23, и преобразует его обратно в 123, используя аналогичный метод.
Вот пример того, как я его использовал
...
self.accountBalanceCell.textField.text = [[NumberFormatting alloc] decimalToIntString:account.accountBalance];
...
[self.accountBalanceCell.textField addTarget:self
action:@selector(updateBalance:)
forControlEvents:UIControlEventEditingChanged];
Здесь мы устанавливаем значение текстового поля равным десятичному значению из хранилища данных, а затем мы устанавливаем наблюдателя для отслеживания изменений в текстовом поле и запускаем метод updateBalance
- (void)updateBalance:(id)sender {
UILabel *balanceLabel = (UILabel *)[accountBalanceCell.contentView viewWithTag:1000];
NSString *value = ((UITextField *)sender).text;
balanceLabel.text = [[NumberFormatting alloc] stringToCurrency:value];
}
, который просто берет значение текстового поля и запускает его через метод stringToCurrency, описанный выше.
Мне это кажется хакерским, поэтому, пожалуйста, найдите время, чтобы посмотреть и почистить его, если вы заинтересованы в его использовании. Также я замечаю, что при больших значениях он ломается.