iOS中金额字符串格式化显示的方法示例

前言

由于项目中很多地方展现统计金额, 比如在一些金融类的 App 中,对于表示金额类的字符串,通常需要进行格式化后再显示出来。例如:

0 –> 0.00
123 –> 123.00
123.456 –> 123.46
102000 –> 102,000.00
10204500 –> 10,204,500.00

它的规则如下:

个位数起每隔三位数字添加一个逗号,同时保留两位小数,也称为“千分位格式”。

我们一开始采取了一种比较笨拙的处理方式如下:

首先根据小数点 . 将传入的字符串分割为两部分,整数部分和小数部分(如果没有小数点,则补 .00,如果有多个小数点则报金额格式错误)。对于小数部分,只取前两位;然后对整数部分字符串进行遍历,从右到左,每三位数前插入一个逗号 ,,最后再把两部分拼接起来,代码大致如下:

- (NSString *)moneyFormat:(NSString *)money {
 if (!money || money.length == 0) {
 return money;
 }

 BOOL hasPoint = NO;
 if ([money rangeOfString:@"."].length > 0) {
 hasPoint = YES;
 }

 NSMutableString *pointMoney = [NSMutableString stringWithString:money];
 if (hasPoint == NO) {
 [pointMoney appendString:@".00"];
 }

 NSArray *moneys = [pointMoney componentsSeparatedByString:@"."];
 if (moneys.count > 2) {
 return pointMoney;
 } else if (moneys.count == 1) {
 return [NSString stringWithFormat:@"%@.00", moneys[0]];
 } else {
 // 整数部分每隔 3 位插入一个逗号
 NSString *frontMoney = [self stringFormatToThreeBit:moneys[0]];
 if ([frontMoney isEqualToString:@""]) {
  frontMoney = @"0";
 }
 // 拼接整数和小数两部分
 NSString *backMoney = moneys[1];
 if ([backMoney length] == 1) {
  return [NSString stringWithFormat:@"%@.%@0", frontMoney, backMoney];
 } else if ([backMoney length] > 2) {
  return [NSString stringWithFormat:@"%@.%@", frontMoney, [backMoney substringToIndex:2]];
 } else {
  return [NSString stringWithFormat:@"%@.%@", frontMoney, backMoney];
 }
 }
}

其中,stringFormatToThreeBit: 方法的实现如下:

- (NSString *)stringFormatToThreeBit:(NSString *)string {
 NSString *tempString = [string stringByReplacingOccurrencesOfString:@"," withString:@""];
 NSMutableString *mutableString = [NSMutableString stringWithString:tempString];
 NSInteger n = 2;
 for (NSInteger i = tempString.length - 3; i > 0; i--) {
 n++;
 if (n == 3) {
  [mutableString insertString:@"," atIndex:i];
  n = 0;
 }
 }
 return mutableString;
}

上述实现看起来非常繁琐。

其实,苹果提供了 NSNumberFormatter 用来处理 NSString 和 NSNumber 之间的转化,可以满足基本的数字形式的格式化。

正确姿势

我们通过设置 NSNumberFormatter 的 numberStyle 和 positiveFormat 属性,即可实现上述功能,非常简洁,代码如下:

- (NSString *)formatDecimalNumber:(NSString *)string {
 if (!string || string.length == 0) {
 return string;
 }

 NSNumber *number = @([string doubleValue]);
 NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
 formatter.numberStyle = kCFNumberFormatterDecimalStyle;
 formatter.positiveFormat = @"###,##0.00";

 NSString *amountString = [formatter stringFromNumber:number];
 return amountString;
}

关于 NSNumberFormatter 更详细的用法,可以参考这篇文章的介绍:NSNumberFormatter 介绍和用法

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • IOS判断字符串是不是纯数字的方法总结

    前言 在大家开发项目的时候,遇到需求可能是让我们只输入一段纯数字,这时候我们就要对这个字符串进行筛选判断,不符合纯数字进行提示操作,以求达到最好的交互效果也能满足需求. 下面介绍几种判断字符串是否为纯数字的方法 第一种方式是使用NSScanner: 1. 整形判断 - (BOOL)isPureInt:(NSString *)string{ NSScanner* scan = [NSScanner scannerWithString:string]; int val; return [scan s

  • iOS时间字符串格式化输出技巧详解

    一.前言 最近项目开发过程中用到了大量的关于时间的处理,将后台返回的时间字符串转换为指定的格式时间再显示在UI上. 例如: 将后台返回的时间字符串2017-04-16 13:08:06转换为:2017年04月16日.2017年04月.04月16日.2017-04-16.2017-04.04-16.13:08.星期几等等. 项目是多人开发,由于前期没有统一处理时间转换的问题,后期发现项目中好多关于时间转换的代码,大部分都是通过(- : 等字符)截取成字符串数组再取相应时间拼接成指定格式,输出在UI

  • IOS 字符串常用处理详细介绍

    IOS 字符串常用处理详细介绍 NSString *tempA = @"123"; NSString *tempB = @"456"; 1,字符串拼接 NSString *newString = [NSString stringWithFormat:@"%@%@",tempA,tempB]; 2,字符转int int intString = [newString intValue]; 3,int转字符 NSString *stringInt =

  • iOS中字符串换行的实现方法

    前言 今天碰到一个需求就是 后台返回一串字符串是 @"1,你好你好你好年后:2你好你好年后你好你好:3你好哈你好呢你好呢年后"这种格式,放到封装好的alert提示框是这样的 优化的要求是要换行显是 在aler提示框上格式得这样 解决方法 刚才想法是字符串 拼接@"\n",当初走了一下弯路,因为是封装一下alert,所以我就在字符串传个alert的时候 在alert里面去处理这个字符串,后来发现不可以,出现把@"\n",拼接上去,nslog打印出来

  • IOS判断字符串是否有空格实例

    以下是自己封装的一个方法,可以根据返回的bool值进行判断 实例代码 -(BOOL)isEmpty:(NSString *) str { NSRange range = [str rangeOfString:@" "]; if (range.location != NSNotFound) { return YES; //yes代表包含空格 }else { return NO; //反之 } } 小结 以上就是这篇文章的全部内容,希望对大家的开发和学习有一定的帮助,如果有问题大家可以留言

  • iOS中使用MD5加密字符串

    1,新建NSString的分类,记得添加加密所需的头文件#import <CommonCrypto/CommonDigest.h> , NSString+MD5.h: #import <Foundation/Foundation.h> #import <CommonCrypto/CommonDigest.h> @interface NSString (MD5) + (NSString *)md5To32bit:(NSString *)str; @end 2,编写加密方法

  • iOS 中 使用UITextField格式化银行卡号码的解决方案

    今天做格式化银行卡,避免重复造轮子,找度娘查了下,看到一个不错的实现方式,记录下来,并附带实现思路 #pragma mark - UITextFieldDelegate UITextField键入字符后调用 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { //拿到为改变前的字符串 NSStri

  • IOS用AFN发送字符串形式的Json数据给服务器实例

    每个人遇到后台的需求不一样,我只能写出自己目前遇到的需求和做法,我的后台是需要一个Json的key,对应一个字符串类型的字典,后台要求的是带双引号和冒号的字典,所以就拼接了一下 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 发送post请求 // manager.responseSerializer = [AFJSONResponseSerializer serializer]; manager.respon

  • iOS中金额字符串格式化显示的方法示例

    前言 由于项目中很多地方展现统计金额, 比如在一些金融类的 App 中,对于表示金额类的字符串,通常需要进行格式化后再显示出来.例如: 0 –> 0.00 123 –> 123.00 123.456 –> 123.46 102000 –> 102,000.00 10204500 –> 10,204,500.00 它的规则如下: 个位数起每隔三位数字添加一个逗号,同时保留两位小数,也称为"千分位格式". 我们一开始采取了一种比较笨拙的处理方式如下: 首先根据

  • 在iOS中给视频添加滤镜的方法示例

    「众所周知,视频可以 P」,今天我们来学习怎么给视频添加滤镜. 在 iOS 中,对视频进行图像处理一般有两种方式: GPUImage 和 AVFoundation . 一.GPUImage 在之前的文章中,我们对 GPUImage 已经有了一定的了解.之前一般使用它对摄像头采集的图像数据进行处理,然而,它对本地视频的处理也一样方便. 直接看代码: // movie NSString *path = [[NSBundle mainBundle] pathForResource:@"sample&q

  • iOS中Navbar设置渐变色效果的方法示例

    本文主要给大家介绍了关于iOS中Navbar设置渐变色效果的相关内容,分享出来供大家参考学习,下面来看看详细的介绍吧. 设置渐变色 #import "NavigationViewController.h" #define LBColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0] @interface NavigationViewController () @end

  • iOS中精确计算WebView高度的方法示例

    前言 在开发app的过程中难免会遇到将webView加载到tableView的cell上的需求,一般遇到这种问题,通常想到的思路就是在webView的回调方法webViewDidFinishLoad中获取到webView的高度,刷新tableView,将高度赋值给tableView的回调方法heightForRow.看似没有任何问题,但是在实际操作的时候却发现得到的高度并不是webView的实际高度,显然这种方法是行不通的.其实并不是方法不行,而是webViewDidFinishLoad代理方法

  • iOS中设置圆角的几种方法示例

    前言 圆角(RounderCorner)是一种很常见的视图效果,相比于直角,它更加柔和优美,易于接受.但很多人并不清楚如何设置圆角的正确方式和原理.设置圆角会带来一定的性能损耗,如何提高性能是另一个需要重点讨论的话题.我查阅了一些现有的资料,收获良多的同时也发现了一些误导人错误. 1. 使用layer属性 layer.backgroundColor = [UIColor cyanColor].CGColor; // 给图层添加背景色 layer.contents = (id)[UIImage i

  • iOS开发中判断字符串为空的方法

    前言: 判断字符串为空:看似简单的问题,有人会说不就使用[string isEqualToString:@""]或者更简单的string.text == nil就行了嘛.但是并没有考虑到其中存在的一些问题,例如当字符串中存在空格或者换行时或者当请求后台数据时得到的是进行JSON解析的时候, 如果解析出的NSDictionary中某个key对应的value为空, 则系统会把它处理为NSNull类的单例对象.这些情况下,上面的判断方法就不会起到作用. 具体实现: + (BOOL)isBla

  • iOS中常见的几种加密方法总结

    前言 在我们日常开发中,加密是必不可少的一部分,而普通加密方法是讲密码进行加密后保存到用户偏好设置中,钥匙串是以明文形式保存,但是不知道存放的具体位置,下面本文将详细给大家介绍iOS中常见的几种加密方法,下面话不多说了,来一起看看详细的介绍吧. 一. base64加密 base64 编码是现代密码学的基础 基本原理: 原本是 8个bit 一组表示数据,改为 6个bit一组表示数据,不足的部分补零,每 两个0 用 一个 = 表示 用base64 编码之后,数据长度会变大,增加了大约 1/3 左右.

  • 如何使用JS在HTML中自定义字符串格式化

    Python中支持字符串格式化,其基本形式如下: str = "I'm %s, %s years old." % ('jack', 19) print(str) #结果: I'm jack, 19 years old. 在JavaScript中虽没有类似的方法,但我们可以利用字符串的replace方法自定义字符串的格式化方法: <script> $(function () { /*自定义字符串格式化*/ String.prototype.Format = function

  • 详解Python3 中的字符串格式化语法

    一.旧式的字符串格式化 % 操作符 参考以下示例: >>> name = "Eric" >>> "Hello, %s." % name 'Hello, Eric.' 当有多个变量需要插入到字符串中时: >>> name = "Eric" >>> age = 74 >>> "Hello, %s. You are %s." % (name,

  • PHP清除数组中所有字符串两端空格的方法

    本文实例讲述了PHP清除数组中所有字符串两端空格的方法,分享给大家供大家参考.具体实现方法如下: 一般来说在php中清除字符串中空格我们可以有很多实现方法,但清除数组中所有值的前后代码我们并不能简单的使用这些方法,本文实例主要使用php独有的array_map函数遍历清除数组中所有字符串的两端空格.   具体实现代码如下: 复制代码 代码如下: function TrimArray($Input){     if (!is_array($Input))         return trim($

随机推荐