zoukankan      html  css  js  c++  java
  • iOS 科学计数法保留N位有效数字

    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;
        
    }
    
    
  • 相关阅读:
    PaaS 7层动态路由的若干实现
    05-OC对象的内存分析
    04-类与对象的练习(第二个OC的类)
    03-类的声明和实现(第一个OC的类)
    02-类与对象的关系
    01-面向对象和面向过程
    06-BOOL类型的使用
    05-初识OC多文件编程(第4个OC程序)
    04-初识OC多文件编程(第3个OC程序)
    03-第二个OC程序
  • 原文地址:https://www.cnblogs.com/qqcc1388/p/8134807.html
Copyright © 2011-2022 走看看