iOS - 格式化金額,三位一逗號

項目版本更新迭代中, 新增需求: 所有金額必須用標準會計表示方式(¥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兩種均可).

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,941評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,335評論 25 708
  • 昨天今天過去不再回來 紅顏落下色彩變蒼白 從前直到現在 愛還在 這是喬先生最喜歡的歌曲,我記得他和我在一起的時候還...
    情味寡淡閱讀 3,110評論 22 51
  • 朋友圈的寶寶們,妮可10天前寫過一封信給大家,是我剛開始參加特訓的時候,那時候期待自己成為一個銷售精英中的精英,并...
    妮可兒5288閱讀 213評論 0 0
  • 每次暑假回家,都會去高中母校看看。 這是畢業的第三年,已經大三的我們單獨看起來像個學生,還有些稚嫩與青澀。 回到學...
    大紅啊閱讀 682評論 2 5