iPhone: Как я могу добавить символ валюты, десятичную точку и десятичные знаки в shouldChangeCharactersInRange - PullRequest
1 голос
/ 26 сентября 2010

Я нашел код ниже, который я пытаюсь заставить работать в событии UITableView shouldChangeCharactersInRange. Без символа валюты работает нормально.

Когда я пытаюсь добавить символ валюты, он просто позволяет мне ввести один номер. Что он должен сделать, это, скажем, я ввожу 7536, он должен появиться в следующих шагах £ 0,07, £ 0,75, £ 7,53, £ 75,36, но вместо этого он выглядит как £ 0,07, £ 0,05, 0,03, £ 0,06

Вот код.

- (BOOL)textField:(UITextField *)textField 
        shouldChangeCharactersInRange:(NSRange)range 
        replacementString:(NSString *)string
{    BOOL res = TRUE;

    double currentValue = [textField.text doubleValue];
    double cents = round(currentValue * 100.0f);

    if ([string length]) {
        for (size_t i = 0; i < [string length]; i++) {
            unichar c = [string characterAtIndex:i];
            if (isnumber(c)) {
                cents *= 10;
                cents += c - '0'; 
            }            
        }
    } else {
        // back Space
        cents = floor(cents / 10);
    }

    // This line next works without the currency symbol
    //textField.text = [NSString stringWithFormat:@"%.2f", cents / 100.0f];

    NSMutableString *aString = [NSMutableString stringWithFormat:@"%@", strCurrencySymbol];    
    [aString appendFormat:@"%.2f", cents / 100.0f];
    textField.text = aString;

    res = NO;
return res;

}

Ответы [ 2 ]

0 голосов
/ 30 сентября 2010
    NSCharacterSet *currencySet = [NSCharacterSet characterSetWithCharactersInString:@"$€£¥"];
    NSMutableString *strSource = [NSMutableString stringWithString:textField.text];
    if (![strSource isEqualToString:@""]) {
        [strSource replaceCharactersInRange: [strSource rangeOfCharacterFromSet:currencySet]  withString:@""];
    }

    double currentValue = [strSource doubleValue];
    double cents = round(currentValue * 100.0f);

    if ([string length]) {
        for (size_t i = 0; i < [string length]; i++) {
            unichar c = [string characterAtIndex:i];
            if (isnumber(c)) {
                cents *= 10;
                cents += c - '0'; 
            }            
        }
    } else {
        // back Space
        cents = floor(cents / 10);
    }

    NSMutableString *aString = [NSMutableString stringWithFormat:@"%@", strCurrencySymbol];    // does not need to be released. Needs to be retained if you need to keep use it after the current function.
    switch (intDecimalPlaces) {
        case 0:
            [aString appendFormat:@"%.0f", cents / 100.0f];
            break;
        case 1:
            [aString appendFormat:@"%.1f", cents / 100.0f];
            break;
        case 2:
            [aString appendFormat:@"%.2f", cents / 100.0f];
            break;
        case 3:
            [aString appendFormat:@"%.3f", cents / 100.0f];             
            break;
        default:
            break;
    }

    textField.text = aString;

Я забыл удалить символ валюты в начале.Затем вы добавляете его в конец без проблем.

0 голосов
/ 26 сентября 2010

[@"£1.23" doubleValue] равно 0. Вы должны пропустить ведущий символ валюты, если он есть, что-то вроде:

NSString * currentText = textField.text;
NSRange range = [currentText rangeOfString:strCurrencySymbol];
if (range.location == 0)
{
  currentText = [currentText substringFromIndex:range.length];
}
double currentValue = [currentText doubleValue];

В общем, я бы советовал не делать такие вещи:

  • Может работать не со всеми методами ввода (и IIRC shouldChangeCharactersInRange: не вызывается для автозаполнения).
  • Это не кажется удобным для пользователя, если вы не работаете в кассе(где у них есть клавиша «00», потому что в противном случае ввод «$ 100,00» является болью).Я хочу, чтобы можно было ввести «1» и означать $ 1,00
  • Это не локализовано.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...