如何以浮点格式编写 NSString?

How to write NSString in a float format?

在我的应用程序中,我有一个 UITextField。当用户输入 123456 之类的文本时,它应该在文本字段中显示 123,456.00 之类的内容。

使用了以下代码:

UITextField *txt = [[UITextField alloc]initWithFrame:CGRectMake(300, 120+y*58, 280, 31)];
txt.keyboardType = UIKeyboardTypeDecimalPad;
txt.borderStyle = UITextBorderStyleRoundedRect;
txt.font = [UIFont systemFontOfSize:15];
txt.textAlignment = NSTextAlignmentLeft;
txt.returnKeyType = UIReturnKeyDefault;
txt.delegate = self;
[txt addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

-(void)textFieldDidChange:(UITextField *)theTextField
{
    NSString *textFieldText = [theTextField.text stringByReplacingOccurrencesOfString:@"," withString:@""];
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];

    NSNumber *number = [formatter numberFromString:textFieldText];
    NSString *formattedOutput = [formatter stringFromNumber:number];

    theTextField.text=formattedOutput;
}

使用下面的代码

NSString *textFieldText = theTextField.text ;

float f = [theString floatValue];

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setMinimumFractionDigits:2];
[formatter setMaximumFractionDigits:2];
[formatter setLocale:[NSLocale currentLocale]];

NSLog(@"%@", [formatter stringFromNumber:@(f)]);

将 MinimumFractionDigits 设置为 2 并将 MaximumFractionDigits 设置为 2.Try 以上代码中文本字段的 textFieldDidEndEditing 委托方法。

您可以将这样的文本设置到您的文本视图中。

theTextField.text = [NSString stringWithFormat:@"%.02f", floatVal];

希望对您有所帮助。

如果将这两行添加到您发布的代码片段中:

[formatter setMinimumFractionDigits:2];
[formatter setMaximumFractionDigits:2];

就在您将数字格式化程序的样式设置为 NSNumberFormatterDecimalStyle 的那一行之后,它应该会为您提供您想要的内容。

@"123456" 将导致 @"123,456.00" @"1" 将导致 @"1.00"

您几乎接近您的解决方案,只有很少的地方需要改进。首先,您必须指定允许的最大和最小分数位数,如下所示:

[formatter setMinimumFractionDigits:2];
[formatter setMaximumFractionDigits:2];

它将解决 *.00 问题,然后将其更新回 UI 是另一个问题。由于您正在设置文本字段文本:

 theTextField.text=formattedOutput;

它将失去当前编辑位置,因此您将失去地面。例如,

您输入了 1,上面的代码会将文本字段更新为 1.00,并且光标将移动到位置 5:

1.00

^^^^^

如果您进一步编辑,您将不会得到预期的结果(文本将尝试在末尾追加)。

要解决此问题,您应该在使用处理程序 textFieldDidEndEditing 完成编辑后更新文本字段,或者您应该使用其他一些控件,例如 UILabel 来显示格式化结果。

示例代码:(用于演示)

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    UITextField *txt = [[UITextField alloc]initWithFrame:CGRectMake(20, 120+(3)*58, 280, 31)];
    txt.keyboardType = UIKeyboardTypeDecimalPad;
    txt.borderStyle = UITextBorderStyleRoundedRect;
    txt.font = [UIFont systemFontOfSize:15];
    txt.textAlignment = NSTextAlignmentLeft;
    txt.returnKeyType = UIReturnKeyDefault;
    txt.delegate = self;
    [self.view addSubview:txt];
    [txt addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
    
     lbl = [[UILabel alloc] initWithFrame:CGRectMake(20, 160+(3)*58, 280, 31)];
    [self.view addSubview:lbl];
}

-(void)textFieldDidChange:(UITextField *)theTextField
{
     NSString *textFieldText = [theTextField.text stringByReplacingOccurrencesOfString:@"," withString:@""];

     NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    [formatter setMinimumFractionDigits:2];
    [formatter setMaximumFractionDigits:2];
    
     NSNumber *number = [formatter numberFromString:textFieldText];
     NSString *formattedOutput = [formatter stringFromNumber:number];
    
    [lbl setText:formattedOutput];
}