• 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;
        
    }
    
    
  • 相关阅读:
    iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义
    一个基于MVVM的TableView组件化实现方案
    代码审查和不良编程习惯
    十二步创建你的第一个JavaScript库
    可简单避免的三个 JavaScript 发布错误
    巧用Javascript将相对路径地址转换为绝对路径
    jquery 事件对象属性小结
    26个Jquery使用小技巧
    应用于网站导航中的 12 个 jQuery 插件
    使用 jQuery 避免鼠标双击
  • 原文地址:https://www.cnblogs.com/qqcc1388/p/8134807.html
Copyright © 2020-2023  润新知