【问题标题】:How to convert a string into double and vice versa?如何将字符串转换为双精度,反之亦然?
【发布时间】:2010-09-15 06:10:25
【问题描述】:

我想把一个字符串转换成一个双精度数,在对它做一些数学运算后,把它转换回一个字符串。

如何在 Objective-C 中做到这一点?

有没有办法将双精度数四舍五入到最接近的整数?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    您可以使用

    将 NSString 转换为 double
    double myDouble = [myString doubleValue];
    

    四舍五入到最近的 int 可以这样完成

    int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
    

    老实说,我不确定是否有比转换回字符串更简化的方法

    NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
    

    【讨论】:

    • 您不一定要这样做,因为不同的语言环境对数字的格式不同。有些人会为一千写“1000”,而其他人会写“1,000”而其他人会写“1.000”——你从 -[NSString doubleValue] 得到什么?
    • Double 是数字数据类型 - 它不包含任何格式。调用 [NSString doubleValue] 将返回 1000,因为它只是一个数字。
    • 而且 NSString 不能包含数字,只能包含数字的表示。该表示可能采用因区域设置而异的多种格式中的任何一种。
    • 您可能希望将@Barry Wark 的答案整合到您的答案中,[[NSNumber numberWithInt:myInt] stringValue]
    • 如果字符串值不是有效的双字符串怎么办,那么 doubleValue 将返回 0.0。在我看来,建议使用 NSNumberFormatter 的解决方案更好,因为如果字符串不代表有效的双字符串,则返回 nil。
    【解决方案2】:

    要真正正确地将字符串转换为数字,您需要使用为您正在读取字符串的语言环境配置的NSNumberFormatter 实例。

    不同的语言环境会以不同的方式格式化数字。例如,在世界的某些地方,COMMA 用作小数分隔符,而在其他地方则使用 PERIOD — 并且千位分隔符(使用时)被颠倒了。除非它是一个空间。或者根本不存在。

    这实际上取决于输入的来源。最安全的做法是为输入的格式配置NSNumberFormatter,并使用-[NSFormatter numberFromString:] 从中获取NSNumber。如果要处理转换错误,可以改用-[NSFormatter getObjectValue:forString:range:error:]

    【讨论】:

    • 或者您可以使用本地化扫描仪,例如使用 [NSScannerlocalizedScannerWithString:] 创建的扫描仪,然后 [scanner scanDouble:&aDouble] 将根据用户当前的语言环境进行双重扫描。
    【解决方案3】:

    添加到 olliej 的答案,您可以使用 NSNumber's stringValue 从 int 转换回字符串:

    [[NSNumber numberWithInt:myInt] stringValue]
    

    NSNumber 上的stringValue 调用descriptionWithLocale:nil,为您提供值的本地化字符串表示。我不确定[NSString stringWithFormat:@"%d",myInt] 是否会为您提供正确本地化的myInt 表示。

    【讨论】:

      【解决方案4】:

      这是 NSNumberFormatter 读取本地化数字字符串(xCode 3.2.4,osX 10.6)的工作示例,以节省其他人我刚刚花费的时间。注意:虽然它可以处理诸如“8,765.4”之类的尾随空格,但它不能处理前导空格,也不能处理杂散的文本字符。 (错误的输入字符串:“8”、“8q”和“8 q”。)

      NSString *tempStr = @"8,765.4";  
           // localization allows other thousands separators, also.
      NSNumberFormatter * myNumFormatter = [[NSNumberFormatter alloc] init];
      [myNumFormatter setLocale:[NSLocale currentLocale]]; // happen by default?
      [myNumFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
           // next line is very important!
      [myNumFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; // crucial
      
      NSNumber *tempNum = [myNumFormatter numberFromString:tempStr];
      NSLog(@"string '%@' gives NSNumber '%@' with intValue '%i'", 
          tempStr, tempNum, [tempNum intValue]);
      [myNumFormatter release];  // good citizen
      

      【讨论】:

      • 如果字符串不是有效字符串,numberFromString 会返回什么?
      • numberFromString:返回一个 NSNumber 对象。请参阅苹果文档中的 NumberFormattingNSNumberFormatter。 (我不确定 NSNumber 对象如何编码“不是数字”或“错误数字”,但我看到有一个 NSNull 可能的值。)
      • @BenClayton numberFromString 如果无法解析,则返回值为 NSNumber*nil。我无法重现您在前导空格和杂散文本字符方面遇到的问题,IMO 它工作正常。 " 28.5 "解析为28.5,而"gibberish28.5""28.5gibberish""gibberish28.5gibberish"都是不可解析的; " 2 8 . 5. " 无法解析,但这并不罕见。
      【解决方案5】:

      olliej 的rounding 方法对于负数是错误的

      • 2.4 舍入为 2(olliej 的方法正确)
      • -2.4 舍入为 -2(olliej 的方法返回 -1)

      这是另一种选择

        int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
      

      您当然可以使用 math.h 中的舍入函数

      【讨论】:

        【解决方案6】:
        // Converting String in to Double
        
        double doubleValue = [yourString doubleValue];
        
        // Converting Double in to String
        NSString *yourString = [NSString stringWithFormat:@"%.20f", doubleValue];
        // .20f takes the value up to 20 position after decimal
        
        // Converting double to int
        
        int intValue = (int) doubleValue;
        or
        int intValue = [yourString intValue];
        

        【讨论】:

          【解决方案7】:

          对于从数字到字符串的转换,如何使用新的文字语法(XCode >= 4.4),它更紧凑一些。

          int myInt = (int)round( [@"1.6" floatValue] );
          
          NSString* myString = [@(myInt) description];
          

          (将其封装为NSNumber 并使用NSObjects' description method 转换为字符串)

          【讨论】:

            【解决方案8】:

            对于舍入,您可能应该使用 math.h 中定义的 C 函数。

            int roundedX = round(x);
            

            按住 Option 并双击 Xcode 中的round,它会显示手册页,其中包含用于舍入不同类型的各种函数。

            【讨论】:

              【解决方案9】:

              这是我所知道的最简单的方法:

              float myFloat = 5.3;
              NSInteger myInt = (NSInteger)myFloat;
              

              【讨论】:

                【解决方案10】:

                从这里的示例中,您可以看到两种方式的转换:

                NSString *str=@"5678901234567890";
                
                long long verylong;
                NSRange range;
                range.length = 15;
                range.location = 0;
                
                [[NSScanner scannerWithString:[str substringWithRange:range]] scanLongLong:&verylong];
                
                NSLog(@"long long value %lld",verylong);
                

                【讨论】:

                  【解决方案11】:

                  将文本字段中输入的文本转换为整数

                  double mydouble=[_myTextfield.text doubleValue];
                  

                  四舍五入到最接近的双精度

                  mydouble=(round(mydouble));
                  

                  四舍五入到最接近的整数(只考虑正值)

                  int myint=(int)(mydouble);
                  

                  从双精度转换为字符串

                  myLabel.text=[NSString stringWithFormat:@"%f",mydouble];
                  

                  NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
                  

                  从整数转换为字符串

                  myLabel.text=[NSString stringWithFormat:@"%d",myint];
                  

                  NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
                  

                  【讨论】:

                    【解决方案12】:

                    我最终使用了这个方便的宏:

                    #define STRING(value)               [@(value) stringValue]
                    

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-05-27
                      • 2017-03-10
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2021-11-23
                      • 1970-01-01
                      相关资源
                      最近更新 更多