項目版本更新迭代中, 新增需求: 所有金額必須用標準會計表示方式(¥94,862.57).
而之前金額展示僅僅天天人民幣¥符號, 千位沒有逗號, 僅僅拼接字符串就好 .
由于項目中很多地方展現統計金額, 準備考慮封裝下分類.
自定義金額的格式轉化文件NSString+ZLMoney:
通過NSNumberFormatter
,設置NSNumber輸出的格式:
/**
* 金額的格式轉化
* str : 金額的字符串
* numberStyle : 金額轉換的格式
* return NSString : 轉化后的金額格式字符串
*/
+ (NSString *)stringChangeMoneyWithStr:(NSString *)str numberStyle:(NSNumberFormatterStyle)numberStyle {
// 判斷是否null 若是賦值為0 防止崩潰
if (([str isEqual:[NSNull null]] || str == nil)) {
str = 0;
}
NSNumberFormatter *formatter = [[NSNumberFormatter alloc]init];
formatter.numberStyle = numberStyle;
// 注意傳入參數的數據長度,可用double
NSString *money = [formatter stringFromNumber:[NSNumber numberWithDouble:[str doubleValue]]];
return money;
}
NSNumberFormatter類有個屬性numberStyle
,是一個枚舉型,設置不同的值可以輸出不同的數字格式。該枚舉包括:
/**
* 94863
* NSNumberFormatterNoStyle = kCFNumberFormatterNoStyle,
* 94,862.57
* NSNumberFormatterDecimalStyle = kCFNumberFormatterDecimalStyle,
* ¥94,862.57
* NSNumberFormatterCurrencyStyle = kCFNumberFormatterCurrencyStyle,
* 9,486,257%
* NSNumberFormatterPercentStyle = kCFNumberFormatterPercentStyle,
* 9.486257E4
* NSNumberFormatterScientificStyle = kCFNumberFormatterScientificStyle,
* 九萬四千八百六十二點五七
* NSNumberFormatterSpellOutStyle = kCFNumberFormatterSpellOutStyle
*/
在所需控制器里調用測試,
#import "NSString+ZLMoney.h"
// 測試數據:
self.cost = @"94862.57";
// 一般標準金額格式¥94,862.57
costValue.text = [NSString stringChangeMoneyWithStr:self.cost];
// 選取枚舉對應的金額數字格式
costValue.text = [NSString stringChangeMoneyWithStr:self.cost numberStyle:NSNumberFormatterCurrencyStyle];
PS:注意! iOS11之后kCFNumberFormatterCurrencyStyle 在中文狀態下前綴變成了CN¥不是¥.這里選擇使用kCFNumberFormatterDecimalStyle然后拼接¥符號
money = [NSString stringWithFormat:@"¥%@", money];
考慮到這種拼接情況,也可以自定義金額正數格式, 前綴可在根據自己項目需求隨意添加!
使用NSNumberFormatter類的屬性positiveFormat
.
// 自定義正數格式(金額的格式轉化) 94,862.57 前綴可在所需地方隨意添加
+ (NSString *)stringChangeMoneyWithDouble:(double)number {
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.positiveFormat = @",###.##"; // 正數格式
// 注意傳入參數的數據長度,可用double
NSString *money = [formatter stringFromNumber:@(number)];
// money = [NSString stringWithFormat:@"¥%@", money];
return money;
}
測試效果:
NSLog(@"NSNumberFormatterNoStyle== %@", [NSString stringChangeMoneyWithStr:self.cost numberStyle:NSNumberFormatterNoStyle]);
NSLog(@"NSNumberFormatterDecimalStyle== %@", [NSString stringChangeMoneyWithStr:self.cost numberStyle:NSNumberFormatterDecimalStyle]);
NSLog(@"NSNumberFormatterCurrencyStyle== %@", [NSString stringChangeMoneyWithStr:self.cost numberStyle:NSNumberFormatterCurrencyStyle]);
NSLog(@"NSNumberFormatterPercentStyle== %@", [NSString stringChangeMoneyWithStr:self.cost numberStyle:NSNumberFormatterPercentStyle]);
NSLog(@"NSNumberFormatterScientificStyle== %@", [NSString stringChangeMoneyWithStr:self.cost numberStyle:NSNumberFormatterScientificStyle]);
NSLog(@"NSNumberFormatterSpellOutStyle== %@", [NSString stringChangeMoneyWithStr:self.cost numberStyle:NSNumberFormatterSpellOutStyle]);
打印效果如下:
模擬器中文狀態下的人民幣格式.png
模擬器美元格式.png
需要格式化金額的需求, 可以直接用上面的分類方法即可(使用numberStyle/positiveFormat兩種均可).