1

ユーザーが値を入力するときにテキストフィールドのテキストをフォーマットしたい..それは完全に機能しますが、私の問題は、ユーザーが1を押してから2を押した場合です。私の置換文字列は「12」です。その時の数値は 12 です。私は小数点を取ることができません..

NSNumber* number = [numberFormatter numberFromString:string];  

ここに私の完全なコードがあります、

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

  NSLocale *locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_GB"];

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setLocale:locale];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];

NSString *text = [textField text];
NSString *replacementText = [text stringByReplacingCharactersInRange:range withString:string];
NSMutableString *newReplacement = [[ NSMutableString alloc ] initWithString:replacementText];

NSString *currencyGroupingSeparator = numberFormatter.currencyGroupingSeparator;

[newReplacement replaceOccurrencesOfString:currencyGroupingSeparator withString:@"" options:NSBackwardsSearch range:NSMakeRange(0, [newReplacement length])];






NSNumber * number = [numberFormatter numberFromString:newReplacement];

if (number == nil && [replacementText length]!=0) {

    return NO;
}
NSLog(@"%@",newReplacement);
text = [numberFormatter stringFromNumber:number];
[textField setText:text];
return NO;

  }

スクリーンショットも添付しました。文字列を10進値でフォーマットするにはどうすればよいですか......よろしくお願いします

4

4 に答える 4

1

私にとっては、コード行:

 NSNumber * number = [numberFormatter numberFromString:newReplacement];

は nil を返しませんが、ユーザーが入力した小数点を削除します。これは、numberFormatter id で「12」などの値を渡すためです。または '12.0' を指定すると、フォーマットの一部として小数点が削除されます。12.3 などの他の値の場合、小数は削除されません。

このすべてのコーディングを行うための要件を理解することはできませんが、10 進数が必要な場合は、数値が 12. または 12.0 の形式であるかどうかを確認するロジックを配置し、書式設定をエスケープします。10 進数はそこに残ります。

このコードを使用してください:

NSNumber * number;    
if ([newReplacement hasSuffix:@"."] || [newReplacement hasSuffix:@".0"]) 
{ 

 [textField setText:newReplacement]; return NO; 
} 
else 
{ 
 number = [numberFormatter numberFromString:newReplacement]; 
 }
于 2013-05-22T05:44:02.613 に答える
1

お金の書式設定を扱っている場合は、NSNumberFormatterCurrencyStyle代わりにを使用することをお勧めします。NSNumberFormatterDecimalStyleそれを設定すると、Just Work™ になる場合があります。

しかし、そうではないかもしれません。それにもかかわらず、あなたが見ている動作の理由は、文字列から数値を与えていないことです。12は数字です12.5が、そうで12.はありません。私はそれがnil完全に戻ってこないことに驚いています。

その場合 (そしてまだ壊れている場合) は、おそらく. 最後に を特別なケースにして、それを数値フォーマッタに渡す代わりに追加する必要があります。

于 2013-05-22T06:00:42.103 に答える
0
//Add this in .h file

NSNumberFormatter *formatter;
    NSInteger currencyScale;
    NSString *enteredDigits;


//Add this in .m file`enter code here`
-(void)viewdidload
{
  NSNumberFormatter *aFormatter = [[NSNumberFormatter alloc] init];
    [aFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    currencyScale = -1 * [aFormatter maximumFractionDigits];
    self.formatter = aFormatter;
}


#pragma UItextfield Delegate

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    // Keep a pointer to the field, so we can resign it from a toolbar
    Field = textField;
    if(textField.text==NULL || [textField.text isEqualToString:@""])
    {
        self.enteredDigits = @"";
    //textField.text=@"";
    }


}

- (void)textFieldDidEndEditing:(UITextField *)textField {

}


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { //give tag to text field
    if (textField.tag==10) {
        //  self.priceInput = textField;
        // Check the length of the string
        int len=[self.enteredDigits length];
        NSLog(@"string lenght is %d",len);
        if ([string length]) {
            self.enteredDigits = [self.enteredDigits stringByAppendingFormat:@"%d", [string integerValue]];
        } else {
            // This is a backspace
            NSUInteger len = [self.enteredDigits length];
            if (len > 1) {
                self.enteredDigits = [self.enteredDigits substringWithRange:NSMakeRange(0, len - 1)];
            } else {
                self.enteredDigits = @"";
            }
        }

        NSDecimalNumber *decimal = nil;

        if ( ![self.enteredDigits isEqualToString:@""]) {
            decimal = [[NSDecimalNumber decimalNumberWithString:self.enteredDigits] decimalNumberByMultiplyingByPowerOf10:currencyScale];
            float deci= [decimal floatValue];
            NSLog(@"decimall==%f",deci);
        } else {
            decimal = [NSDecimalNumber zero];
        }

        // Replace the text with the localized decimal number
        float deci= [decimal floatValue];
        NSLog(@"decimall==%f",deci);
        NSString *temp = [self.formatter stringFromNumber:decimal];
        textField.text=temp;
            //NSLog(@"Text fielddddddddddddddf=%@ %@",numberText,temp);

        return NO;  
    }




    return YES;
}

- (BOOL)textFieldShouldClear:(UITextField *)textField
{
    textField.text=@"";
    self.enteredDigits=@"";
    NSLog(@"Clear Clicked");
    return YES;

}



I think this code will help you
于 2013-05-22T06:00:49.420 に答える
0

あなたのコードをログに出力してみました。それは私にとってはうまく機能しています.他のタイプの問題があると思います.

NSLocale *locale=[[NSLocale alloc]initWithLocaleIdentifier:@"en_GB"];
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setLocale:locale];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber* number = [numberFormatter numberFromString:@"12.4"];

NSLog(@"number is %@",number);

ログ印刷-----

数は12.4

于 2013-05-22T05:56:03.920 に答える