Moin zusammen!
Wieder einmal ein Tipp, falls jemand die gleiche Aufgabe zu lösen hat ... und mit der Bitte um Verbesserungsvorschläge, wenn Ihr welche habt:
Meine App braucht ein Feld zur Eingabe von Preisen in der aktuellen Währung des Gerätes. Was mir so vorschwebte:
Alles anzeigen
Ein ungewünschtes Positionieren des Cursors verhinderte ich durch Setzen der selectedTextRange über eine neue UITextFieldDelegate-Methode von iOS 13 - interessanterweise ist deren Dokumentation leer:
Anmerkungen, Korrekturen & Verbesserungsvorschläge sind ausdrücklich willkommen
Mattes ... entspannt im Dänemark-Urlaub
Wieder einmal ein Tipp, falls jemand die gleiche Aufgabe zu lösen hat ... und mit der Bitte um Verbesserungsvorschläge, wenn Ihr welche habt:
Meine App braucht ein Feld zur Eingabe von Preisen in der aktuellen Währung des Gerätes. Was mir so vorschwebte:
- Eingaben sollte über eine rein numerische Tastatur ohne Dezimalzeichen erfolgen
- Die Anzeige wird permanent während der Eingabe aktualisiert und beinhaltet Währungszeichen, Dezimalzeichen und Tausendertrennung
- Eingaben werden von rechts nach links "durchgeschoben": "1234" ergibt also nacheinander die Werte "0,01 €", "0,12 €", "1,23 €" und "12,34 €".
- Gelöscht wird auch wieder von rechts
- Das Ganze muss natürlich robust gegen Fehleingaben, Einfügen aus der Zwischenablage etc. sein
C-Quellcode
- - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
- {
- if (textField == self.priceField)
- {
- // Handle price inputs by overwriting user edity with a currency formated string
- NSNumberFormatter *priceFormatter = [[NSNumberFormatter alloc] init];
- priceFormatter.numberStyle = NSNumberFormatterCurrencyStyle;
- NSNumber *oldPriceNumber = [priceFormatter numberFromString:self.priceField.text];
- NSDecimal oldPrice = (oldPriceNumber) ? oldPriceNumber.decimalValue : [NSDecimalNumber zero].decimalValue;
- NSDecimal newPrice;
- NSDecimalCopy(&newPrice, &oldPrice);
- if (string.length > 0)
- {
- // Check if a number was added, otherwise do nothing
- NSCharacterSet *noDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
- if ([string rangeOfCharacterFromSet:noDigits].location == NSNotFound)
- {
- // Shift the price to the left (multiply by 10) and add the entered digit as the smallest fraction supported by the local currency
- NSDecimal enteredValue = [NSDecimalNumber decimalNumberWithString:string].decimalValue;
- NSDecimalMultiplyByPowerOf10(&enteredValue, &enteredValue, -priceFormatter.maximumFractionDigits, NSRoundPlain);
- NSDecimalMultiplyByPowerOf10(&newPrice, &newPrice, 1, NSRoundPlain);
- NSDecimalAdd(&newPrice, &newPrice, &enteredValue, NSRoundPlain);
- }
- }
- else
- {
- // Backspace, so remove the last digit by shifting the price right (multiply by 0.1), round down to the fraction digits of the local currency
- NSDecimalMultiplyByPowerOf10(&newPrice, &newPrice, -1, NSRoundPlain);
- NSDecimalRound(&newPrice, &newPrice, priceFormatter.maximumFractionDigits, NSRoundDown);
- }
- NSDecimalNumber *newPriceNumber = [NSDecimalNumber decimalNumberWithDecimal:newPrice];
- self.priceField.text = [priceFormatter stringFromNumber:newPriceNumber];
- self.article.price = newPriceNumber;
- return NO;
- }
- return YES;
- }
C-Quellcode
- - (void)textFieldDidChangeSelection:(UITextField *)textField
- {
- if (textField == self.priceField)
- {
- // Don't allow selection / cursor positioning within price / quantity textfields; always set the cursor to the end
- if ([textField.selectedTextRange.start isEqual:textField.endOfDocument] && [textField.selectedTextRange.end isEqual:textField.endOfDocument]) return;
- textField.selectedTextRange = [textField textRangeFromPosition:textField.endOfDocument toPosition:textField.endOfDocument];
- }
- }
Mattes ... entspannt im Dänemark-Urlaub
Diese Seite bleibt aus technischen Gründen unbedruckt.