gpt4 book ai didi

iphone - 将 NSString 转换为货币——完整的故事

转载 作者:行者123 更新时间:2023-11-28 18:45:39 25 4
gpt4 key购买 nike

经过一天多的时间来解决这个问题,我会看看是否能得到一些帮助。以前或多或少有人问过这个问题,但似乎没有人给出完整的答案,所以希望我们现在能得到它。

使用 UILabel 和 UITextView(带数字键盘)我想实现类似 ATM 的行为,让用户只需键入数字,并将其格式化为标签中的货币。这个想法基本上在这里概述:

What is the best way to enter numeric values with decimal points?

唯一的问题是它从未明确说明我们如何才能从文本字段中的整数 123 到标签中显示为 $1.23 或 123¥ 等。任何人都有执行此操作的代码吗?

最佳答案

我已经找到了解决办法,按照这个问题的目的,我会为以后遇到这个问题的人提供一个完整的答案。首先,我创建了一个名为 NumberFormatting 的新帮助程序类,并创建了两个方法。

//
// NumberFormatting.h
// Created by Noah Hendrix on 12/26/09.
//

#import <Foundation/Foundation.h>


@interface NumberFormatting : NSObject {

}

-(NSString *)stringToCurrency:(NSString *)aString;
-(NSString *)decimalToIntString:(NSDecimalNumber *)aDecimal;

@end

这是实现文件:

//
// NumberFormatting.m
// Created by Noah Hendrix on 12/26/09.
//

#import "NumberFormatting.h"


@implementation NumberFormatting

-(NSString *)stringToCurrency:(NSString *)aString {
NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setGeneratesDecimalNumbers:YES];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

if ([aString length] == 0)
aString = @"0";

//convert the integer value of the price to a decimal number i.e. 123 = 1.23
//[currencyFormatter maximumFractionDigits] gives number of decimal places we need to have
//multiply by -1 so the decimal moves inward
//we are only dealing with positive values so the number is not negative
NSDecimalNumber *value = [NSDecimalNumber decimalNumberWithMantissa:[aString integerValue]
exponent:(-1 * [currencyFormatter maximumFractionDigits])
isNegative:NO];

return [currencyFormatter stringFromNumber:value];
}

-(NSString *)decimalToIntString:(NSDecimalNumber *)aDecimal {
NSNumberFormatter *currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setGeneratesDecimalNumbers:YES];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];

if (aDecimal == nil)
aDecimal = [NSDecimalNumber zero];

NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithMantissa:[aDecimal integerValue]
exponent:([currencyFormatter maximumFractionDigits])
isNegative:NO];

return [price stringValue];
}

@end

第一个方法 stringToCurrency 将获取一个整数(在本例中是从文本字段传入的)并根据用户的区域设置适本地移动小数点将其转换为十进制值。然后它使用 NSNumberFormatter 返回一个格式化为货币的字符串表示形式。

第二种方法恰恰相反,它采用类似 1.23 的值,然后使用类似的方法将其转换回 123。

这是我如何使用它的例子

...
self.accountBalanceCell.textField.text = [[NumberFormatting alloc] decimalToIntString:account.accountBalance];
...
[self.accountBalanceCell.textField addTarget:self
action:@selector(updateBalance:)
forControlEvents:UIControlEventEditingChanged];

这里我们将文本字段的值设置为来自数据存储的十进制值,然后我们设置一个观察者来监视文本字段的变化并运行方法 updateBalance

- (void)updateBalance:(id)sender {
UILabel *balanceLabel = (UILabel *)[accountBalanceCell.contentView viewWithTag:1000];
NSString *value = ((UITextField *)sender).text;
balanceLabel.text = [[NumberFormatting alloc] stringToCurrency:value];
}

它只是获取文本字段值并通过上述 stringToCurrency 方法运行它。

对我来说,这似乎很老套,所以如果您有兴趣使用它,请花点时间查看并清理它。我还注意到它会破坏较大的值。

关于iphone - 将 NSString 转换为货币——完整的故事,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1960300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com