iOS开发

项目中用到了将一个很大的数值转换成科学计数法的需求,转换成科学计数法的方式在iOS中其实是很好做的,使用NSNumber 的 kCFNumberFormatterScientificStyle就可以把指定的数值转换成带‘E’后缀的科学计数法字符串了。

由于项目中的特定的需求,NSNumber转换成科学计数法后,后面的小数位无法控制,有些数字很大的时候,小数位甚至会有几十位,导致无法将科学计数法的真实值完全显示出来。这里提供一种方案,可以实现将结果转换成指定位数小数的科学计数法结果,代码如下:

/*
科学计数法,保留n个有效值
*/ -(NSString *) toExponent:(double)d rms:(NSInteger)n
{
if(n==0)
{
return nil;
}
//科学计算法 一般写法4.232E这种样式 这里的n代表所有数字的个数 所以这里n++
n++;
//判断小数的位数是否超过设定的n的值 如果超过了保留n位有效数字 如果不超过则保留默认小数位数
//先将double转换成字符串
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSString *dbStr = [formatter stringFromNumber:[NSDecimalNumber numberWithDouble:d]];
NSInteger length = dbStr.length;
if ([dbStr containsString:@"."]) {
length = dbStr.length - 1;
}
if (length < n) {
n = length;
} CFLocaleRef currentLocale = CFLocaleCopyCurrent();
CFNumberFormatterRef customCurrencyFormatter = CFNumberFormatterCreate
(NULL, currentLocale, kCFNumberFormatterCurrencyStyle);
NSString *s_n = @"#";
if(n > 1)
{
for(int j = 0; j < n; j++)
{
NSString *temp = s_n;
if(j == 0)
{
s_n = [temp stringByAppendingString:@"."];
}
else
{
s_n = [temp stringByAppendingString:@"0"];
} } }
CFNumberFormatterSetFormat(customCurrencyFormatter, (CFStringRef)s_n); double i=1;
int exponent = 0;
while (1) {
i = i*10;
if(d < i)
{
break;
}
exponent++;
}
double n1 = d * 10 / i; CFNumberRef number1 = CFNumberCreate(NULL, kCFNumberDoubleType, &n1);
CFStringRef string1 = CFNumberFormatterCreateStringWithNumber
(NULL, customCurrencyFormatter, number1);
NSLog(@"%@", (__bridge NSString *)string1); NSString * result = [NSString stringWithFormat:@"%@e%d",(__bridge NSString *)string1,exponent]; CFRelease(currentLocale);
CFRelease(customCurrencyFormatter);
CFRelease(number1);
CFRelease(string1); return result; }

iOS 科学计数法保留N位有效数字的更多相关文章

  1. BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)

    转自:https://blog.csdn.net/ochangwen/article/details/51531866 一.简介 Java在java.math包中提供的API类BigDecimal,用 ...

  2. matlab规定小数点保留4位且非科学计数法格式存储txt

    matlab 不保存为科学计数法 http://blog.sciencenet.cn/blog-472136-402727.html 经常在表示matlab值时,它总会把一些小于1的大于1000的数使 ...

  3. [SoapUI] 将科学计数法转化为普通数字,并且只保留小数点后几位

    方案一: import java.text.NumberFormat class CompareHashMap { def regEx_Numeric = '-?[1-9]\\d*$|-?([1-9] ...

  4. C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现

      在C#中大家都会遇到这种情况 double类型的数据,需要格式化(保留N未有效数字)或者是保留N为小数等情况,我们往往采取double.tostring("参数");的方法.下 ...

  5. js 科学计数法 转换为 数字字符 突破幂数正数21位,负数7位的自动转换限制

    前天工作中要转换后台返回的一个数据,返回是的科学计算的数字字符,用网上能搜索到的常用两种方法转换会有倍数的限制,然后又搜索了很久,还是没有找到好的方法,虽然也有一些自己写的方法,可还是不能像下面两种方 ...

  6. [SoapUI] 重载JSONComparator比对JSON Response,忽略小数点后几位,将科学计数法转换为普通数字进行比对,在错误信息中打印当前循环的case number及其他附加信息

    重载JSONComparator比对JSON Response,忽略小数点后几位,将科学计数法转换为普通数字进行比对,在错误信息中打印当前循环的case number及其他附加信息 package d ...

  7. plsql导出查询结果,导出csv文件。但是类似身份证等超出15位的数据后三位显示问题,和科学计数法的格式问题

    问题描述:     plsql导出查询结果时,如果使用导出查询结果,使用excelfile会特别慢.     所以我们一般使用csv文件,然后在excel中新建空白文档,在数据菜单中导入数据,但是导出 ...

  8. PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法

    PL/SQL查询时,如果Number(17)以上的大数,会显示为科学计数法 解决方法: TOOLS->PREFERENCES->WINDOW TYPE->SQL WINDOW下选中N ...

  9. PAT 1024 科学计数法 (20)(精简版代码+思路+推荐测试样例)

    1024 科学计数法 (20)(20 分) 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+, ...

随机推荐

  1. swizzle method 和消息转发机制的实际使用

    我的工程结构,如图 1-0 图  1-0 在看具体实现以前,先捋以下 实现思路. ViewController 中有一个-(void)Amethod;A方法. -(void)Amethod{ NSLo ...

  2. iOS获取所有机型

    1.手机系统版本:9.1 NSString* phoneVersion = [[UIDevice currentDevice] systemVersion]; 2.手机类型:iPhone 6 NSSt ...

  3. canvas三环加载进度条

    之前做了一个三个圆形叠加在一起的加载,用的是定位和cile来操作,但是加载的头部不能是圆形.后来用canvas做了一个,但是这个加载的进度不好调整,原理很简单,就是让一个圆,按照圆形轨迹进行运动就可以 ...

  4. [OIDC in Action] 1. 基于OIDC(OpenID Connect)的SSO

    在[认证授权]系列博客中,分别对OAuth2和OIDC在理论概念方面进行了解释说明,其间虽然我有写过一个完整的示例(https://github.com/linianhui/oidc.example) ...

  5. Unbuntu16.04安装搜狗拼音输入法

    为了让自己的电脑相对安全一些,我安装了ubuntu的物理机 因为要经常输入汉字,我就在unbuntu里面安装了搜狗输入法 1.在搜狗输入法官网下载Linux版本的安装包:http://pinyin.s ...

  6. laravel5.3统计 withCount()方法的使用

    在laravel5.3之后可以使用withCount()这个方法. 注意:一定要是5.3版本之后,5.2和5.1都会报方法未定义 举个栗子: App\Post::withCount('comments ...

  7. Less变量

    Less变量 定义变量 Less 中的变量和其他编程语言一样,可以实现值的复用,同样它也有作用域(scope).简单的讲,变量作用域就是局部变量和全局变量的概念. Less 中,变量作用域采用的是就近 ...

  8. html5 实现 文件夹上传

    先插个背景:最近所在项目有个小需求,就是上传文件要可以同时选择文件夹及文件,然后把文件夹内得文件及所选单文件全部选择上传,借助于搜索关键词没搜到想要的结果(相关文章貌似很好,要么就是遍历文件夹内的文件 ...

  9. poj 1064 Cable master 判断一个解是否可行 浮点数二分

    poj 1064 Cable master 判断一个解是否可行 浮点数二分 题目链接: http://poj.org/problem?id=1064 思路: 二分答案,floor函数防止四舍五入 代码 ...

  10. 手动安装lump

    教你编译PHP7 (nginx+mysql+php7)  PHP7正式版已经发布,性能是PHP5.6的两倍! 操作系统: CentOS Linux, 6.5 64位服务器: 阿里云空的操作系统,我们从 ...