webentwicklung-frage-antwort-db.com.de

Wie kann ich die Anzahl der Dezimalstellen in einem UITextField begrenzen?

Ich habe ein UITextField, das beim Klicken einen Ziffernblock mit einem Dezimalpunkt unten links aufruft. Ich versuche, das Feld so einzuschränken, dass ein Benutzer nur 1 Dezimalstelle setzen kann

z.B.
2.5 OK
2..5 NICHT OK

27
user1282180

Implementieren Sie die shouldChangeCharactersInRange-Methode wie folgt:

// Only allow one decimal point
// Example assumes ARC - Implement proper memory management if not using.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    NSArray  *arrayOfString = [newString componentsSeparatedByString:@"."];

    if ([arrayOfString count] > 2 ) 
        return NO;

    return YES;
}

Dadurch wird ein Array von Strings erstellt, die durch das Dezimalzeichen getrennt sind. Wenn also mehr als ein Dezimalzeichen vorhanden ist, haben wir mindestens drei Elemente im Array.

42
lnafziger

Hier ist ein Beispiel mit einem regulären Ausdruck. Das Beispiel beschränkt sich auf nur ein Dezimalzeichen und 2 Dezimalstellen. Sie können es an Ihre Bedürfnisse anpassen.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    NSString *expression = @"^[0-9]*((\\.|,)[0-9]{0,2})?$";
    NSError *error = nil;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:&error];
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString options:0 range:NSMakeRange(0, [newString length])];
    return numberOfMatches != 0;
}
14
nizx

Für Swift 2.3, um zu verhindern, dass der Benutzer nach zwei Stellen eine Dezimalzahl eingibt -

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
    let decimalPlacesLimit = 2
    let rangeDot = txtPrice.text!.rangeOfString(".", options: .CaseInsensitiveSearch)

    if rangeDot?.count > 0
    {
        if (string == ".")
        {
            print("textField already contains a separator")
            return false
        }
        else {

            var explodedString = txtPrice.text!.componentsSeparatedByString(".")
            let decimalPart = explodedString[1]
            if decimalPart.characters.count >= decimalPlacesLimit && !(string == "")
            {
                print("textField already contains \(decimalPlacesLimit) decimal places")
                return false
            }
        }
    }
}
6
pawan gupta

Aufbauend auf der akzeptierten Antwort validiert der folgende Ansatz drei Fälle, die beim Umgang mit Geldformaten hilfreich sind:

  1. Extrem große Mengen
  2. Mehr als 2 Zeichen nach dem Komma
  3. Mehr als 1 Dezimalstelle

Stellen Sie sicher, dass der Delegat Ihres Textfelds ordnungsgemäß festgelegt ist, Ihre Klasse dem UITextField-Protokoll entspricht, und fügen Sie die folgende Delegatmethode hinzu.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
  // Check for deletion of the $ sign
  if (range.location == 0 && [textField.text hasPrefix:@"$"])
    return NO;

  NSString *updatedText = [textField.text stringByReplacingCharactersInRange:range withString:string];
  NSArray *stringsArray = [updatedText componentsSeparatedByString:@"."];

  // Check for an absurdly large amount
  if (stringsArray.count > 0)
  {
    NSString *dollarAmount = stringsArray[0];
    if (dollarAmount.length > 6)
      return NO;
  }

  // Check for more than 2 chars after the decimal point
  if (stringsArray.count > 1)
  {
    NSString *centAmount = stringsArray[1];
    if (centAmount.length > 2)
      return NO;
  }

  // Check for a second decimal point
  if (stringsArray.count > 2)
    return NO;

  return YES;
}
5
Kyle Clegg

Swift 3 Implementieren Sie diese UITextFieldDelegate-Methode, um zu verhindern, dass der Benutzer eine ungültige Zahl eingibt:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let text = (textField.text ?? "") as NSString
    let newText = text.replacingCharacters(in: range, with: string)
    if let regex = try? NSRegularExpression(pattern: "^[0-9]*((\\.|,)[0-9]*)?$", options: .caseInsensitive) {
        return regex.numberOfMatches(in: newText, options: .reportProgress, range: NSRange(location: 0, length: (newText as NSString).length)) > 0
    }
    return false
}

Es arbeitet sowohl mit Komma als auch mit Punkt als Dezimaltrennzeichen. Sie können die Anzahl der Nachkommastellen auch mit diesem Muster begrenzen: "^[0-9]*((\\.|,)[0-9]{0,2})?$" (in diesem Fall 2).

4
Miroslav Hrivik

Versuche dies :-

public func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {

    if(text == "," || text == "." ){
        let countdots = textView.text!.componentsSeparatedByString(".").count - 1

        if countdots > 0 && (text == "." || text == "," )
        {
            return false
        }
    }

    return true
}
2
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{
    if(textField == min_textfield )
    {
        if([textField.text rangeOfString:@"."].location == NSNotFound)
        {
            if([string isEqualToString:@"."] )
            {
                flag_for_text = 1;
            }
            else 
            {
                textField.text = [NSMutableString stringWithFormat:@"%@",textField.text];
            }
        }
        else 
        {
            if([string isEqualToString:@"."])
            {
                return NO;
            }
            else 
            {
                textField.text = [NSMutableString stringWithFormat:@"%@",textField.text];
            }
        }
    }
}
2
jasveer

Swift 3  

Sie müssen kein Array erstellen und die Anzahl prüfen. Benutzer einschränken können nur eine Dezimalmarke setzen. 

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if (textField.text?.contains("."))! && string.contains(".")
    {
        return false
    }
    else
    {
        return true
    }
}
1
RajeshKumar R

Schnell 4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    // Allow to remove character (Backspace)
    if string == "" {
        return true
    }

   // Block multiple dot
    if (textField.text?.contains("."))! && string == "." {
        return false
    }

    // Check here decimal places
    if (textField.text?.contains("."))! {
        let limitDecimalPlace = 2
        let decimalPlace = textField.text?.components(separatedBy: ".").last
        if (decimalPlace?.count)! < limitDecimalPlace {
            return true
        }
        else {
            return false
        }
    }
    return true
}

Ziel c

//Create this variable in .h file or .m file
float _numberOfDecimal;

//assign value in viewDidLoad method
numberOfDecimal = 2;

#pragma mark - TextFieldDelegate
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    // Allow to remove character (Backspace)
    if ([string isEqualToString:@""]) {
        return true;
    }

    // Block multiple dot
    if ([textField.text containsString:@"."] && [string isEqualToString:@"."]) {
        return false;
    }

    // Check here decimal places
    if ([textField.text containsString:@"."]) {
        NSString *strDecimalPlace = [[textField.text componentsSeparatedByString:@"."] lastObject];

        if (strDecimalPlace.length < _numberOfDecimal) {
            return true;
        }
        else {
            return false;
        }
    }
    return true;
}
0
Vivek

Schnell 4

die maximale Anzahl von Ganzzahlen ist 4, d. h. 9999, und die maximale Dezimalstellenbegrenzung ist 2. Die maximale Anzahl kann also 9999,99 betragen

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {


    // 100 is the tag value of our textfield
    /*or you may use "if textfield == myTextField{" if you have an IBOutlet to that textfield */
    if textField.tag == 100 {

        //max length limit of text is 8
        if textField.text!.count > 8 && string != "" {
            return false
        }

        let maxLength = 8
        let currentString: NSString = textField.text! as NSString 

// Verwenden Sie den folgenden Code. Wenn Sie den Preis in dieses Textfeld eingeben und möchten, dass $ automatisch beim Start eingefügt wird, wenn der Benutzer in das Textfeld eingibt, oder Sie anstelle von $ ein anderes Zeichen eingeben. Andernfalls kommentieren Sie die folgenden 3 Zeilen des if-Bedingungscodes

        if currentString.length == 0 {
            priceTextField.text = "$"
        }

// neue Zeichenfolge nach dem Einfügen der neu eingegebenen Zeichen

        let newString: NSString =
            currentString.replacingCharacters(in: range, with: string) as NSString


        if newString.length > maxLength{
            return false
        }

        if (textField.text!.range(of: ".") != nil) {
            let numStr = newString.components(separatedBy: ".")
            if numStr.count>1{
                let decStr = numStr[1]
                if decStr.length > 2{
                    return false
                }
            }
        }

        var priceStr: String = newString as String

        if (textField.text!.range(of: "$") != nil) {
            priceStr = priceStr.replacingOccurrences(of: "$", with: "")
        }

        let price: Double = Double(priceStr) ?? 0

        if price > 9999.99{
            return false
        }

        switch string {
        case "0","1","2","3","4","5","6","7","8","9":
            return true
        case ".":
            let array = Array(textField.text!)
            var decimalCount = 0
            for character in array {
                if character == "." {
                    decimalCount = decimalCount + 1
                }
            }

            if decimalCount == 1 {
                return false
            } else {
                return true
            }
        default:

            let array = Array(string)
            if array.count == 0 {
                return true
            }
            return false
        }
    }
    return true
}
0
pravir

Fügen Sie in dem Objekt, für das Sie den UITextField-Delegaten festlegen, eine Methode hinzu, die auf "[- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string]" antwortet.

Dann können Sie entweder ein NSNumberFormatter-Objekt verwenden oder Sie können eine Überprüfung auf eine bereits vorhandene Dezimalstellenmarke brutal durchführen (NO zurückgeben, wenn bereits eine Dezimalmarke vorhanden ist).

0

Kurz gesagt, das Zahlenformat lautet wie folgt: [NSString stringWithFormat:@"%9.5f", x]; Wobei 5 nach "," die Dezimalzahl ist.

0
user2494999

Swift 4

Die effiziente und einfache Möglichkeit, mehrere Dezimalpunkte (. Oder,) in UITextField zu vermeiden:

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if(string == "," || string == "." ){

        if ((textField.text?.contains(","))! || (textField.text?.contains("."))!){
            return false
        }
    }
    return true
}
0
user3107831
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if([string isEqualToString:@"."]) {
        BOOL containsDecimal = [textField.text containsString:@"."];
        return !containsDecimal;
    }
    return YES;
}

Wenn das Textfeld bereits ein '.' Enthält dann kehre zurück NEIN sonst kehre zurück JA.

0
Mohsin Khan

Ich habe die Lösung gefunden, mit der Sie die Anzahl der Dezimalstellen steuern können. Der Benutzer kann nur ein Dezimaltrennzeichen eingeben und Sie können auch die Dezimalstellenanzahl steuern.

Stellen Sie einfach den decimalPlacesLimit -Wert richtig ein.

Siehe die Methode:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSLog(@"text on the way: %@", string);
    NSUInteger decimalPlacesLimit = 2;

    NSRange rangeDot = [textField.text rangeOfString:@"." options:NSCaseInsensitiveSearch];
    NSRange rangeComma = [textField.text rangeOfString:@"," options:NSCaseInsensitiveSearch];
    if (rangeDot.length > 0 || rangeComma.length > 0){
        if([string isEqualToString:@"."]) {
            NSLog(@"textField already contains a separator");
            return NO;
        } else {
            NSArray *explodedString = [textField.text componentsSeparatedByString:@"."];
            NSString *decimalPart = explodedString[1];
            if (decimalPart.length >= decimalPlacesLimit && ![string isEqualToString:@""]) {
                NSLog(@"textField already contains %d decimal places", decimalPlacesLimit);
                return NO;
            }
        }
    }

    return YES;
}
0
pedrouan