Formatieren Sie ein UITextField für die Währung

Ich habe ein UITextField in meiner Anwendung, das nur numerische Eingaben vom Benutzer erhält. Diese numerische Eingabe stellt die Währung dar und hat den Standardwert 0,00.

Ich möchte so etwas wie eine Maske erstellen, um das UITextField zu formatieren, während der Benutzer die Zahlen eingibt. Zum Beispiel:

9 wird zu $ 0,09 99 wird zu $ 0,99 999 wird zu $ 999,99

Der folgende Code funktioniert hervorragend, aber da ich Integer- und Float-Werte verwende, zeigt die App nach einem bestimmten Zeitpunkt möglicherweise falsche Werte an. Zum Beispiel:

999999999 wird zu 100000000

Dies liegt daran, dass Flot und Integer nicht genau genug sind und NSDEcimalNumber verwendet werden sollte. Der Punkt ist, dass ich nicht herausfinden kann, wie ich meine Ganzzahlen und Gleitkommawerte durch NSDecimalNumber ersetzen kann.

Kann mir jemand bei der Lösung behilflich sein? Ich habe einige Zeit im Internet nach einer Lösung gesucht, aber nicht die gefunden, die meinen Bedürfnissen entspricht, und Tonnen von Menschen mit dem gleichen Problem.

Hier ist der Code:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if (textField.tag == 1){
    NSString *cleanCentString = [[textField.text componentsSeparatedByCharactersInSet: [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];
    NSInteger centValue= cleanCentString.integerValue;

    if (string.length > 0)
    {
        centValue = centValue * 10 + string.integerValue;
    }
    else
    {
        centValue = centValue / 10;
    }

    NSNumber *formatedValue;
    formatedValue = [[NSNumber alloc] initWithFloat:(float)centValue / 100.0f];
    NSNumberFormatter *_currencyFormatter = [[NSNumberFormatter alloc] init];
    [_currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    textField.text = [_currencyFormatter stringFromNumber:formatedValue];
    return NO;
}

if (textField.tag == 2){
    // Nothing for now
}

return YES;
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage