【问题标题】:Prevent scientific notation with NSDecimalNumber output as NSString防止将 NSDecimalNumber 输出为 NSString 的科学记数法
【发布时间】:2012-01-13 22:21:10
【问题描述】:

我有一个类似于这个问题的问题:How to obtain an unformatted string representation of an NSDecimal or NSDecimalNumber? 我需要一个字符串格式的数字,准确地表示为 NSNumber,但是这个数字在其他地方被转换回字符串,我可以'不要避免这种情况。我遇到的问题是,当数字转换回字符串时,字符串在某些情况下是科学计数法。

NSDecimalNumber *dn = [NSDecimalNumber decimalNumberWithString:@"0.0001"];
NSString *s = [dn stringValue]; // s will be @"1E-4"

如何防止这个数字以科学计数法显示?

我正在使用大约 2005 年的 GNUstep 版本(可能是 GNUstep Base 的 v1.11.1),而不是在 mac 或 iPhone 上工作,这可能是我提到的其他问题与行为差异的原因。我查看了base library API 和我自己的 GNUstep 安装中的文档,但似乎找不到任何帮助。

编辑 2/7/12:

问题略有变化,但目标仍然相同。最初,我认为我无法控制字符串输出片段,但我可以将值作为字符串传回。此时我正在尝试使用格式化字符串,但我仍然想防止出现科学记数法。

[NSString stringWithFormat:@"%1.14g", [val doubleValue]]

我选择使用%g 是因为我们希望该值具有特定数量的有效数字。如果我使用%f,我可以修剪多余的零,但数字并不总是干净利落。例如,800000000.79 显示为 800000000.7899999600。

有没有办法获得一个格式清晰的数字,该数字最多包含一定数量的有效数字(或小数位)而不在该数字之前显示科学记数法?

我也愿意接受 C 的建议。

【问题讨论】:

    标签: objective-c c gnustep nsdecimalnumber


    【解决方案1】:

    您应该查看NSNumberFormatter

    // Create formatter 
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];     
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; // adjust this
    NSString *formattedOutput = [formatter stringFromNumber:yourDecimalNumber];
    

    【讨论】:

    • 看起来在我们使用的任何版本的 GNUstep(可能是 1.11.1?)中,NSNumberFormatter 类都没有完全实现。文档包含以下消息:“此类当前未在 GNUstep 中实现!所有设置方法都将起作用,但 stringForObject: 将完全忽略格式。下面的文档描述了应该是什么行为......”
    【解决方案2】:

    如何获取 C 值(double、int、long 等),然后将其格式化为 C 字符串,或格式化为 NSStringstringWithFormat:

    【讨论】:

      【解决方案3】:

      尝试使用 NSNumberFormatter 而不是 stringValue 方法打印数字。它有更多的选择。

      (我假设 NSNumberFormatter 在 GNUstep 上可用)

      【讨论】:

        【解决方案4】:

        使用以下方法避免科学指数表示法表示。

        将双精度转换为字符串

        func getStringFrom(double doubleVal: Double) -> String
        {
            var stringValue : String = "0.00"
        
            let formatter = NSNumberFormatter()
            formatter.usesSignificantDigits = true;
            formatter.maximumSignificantDigits = 100
            formatter.groupingSeparator = "";
            formatter.numberStyle = .DecimalStyle
            stringValue = formatter.stringFromNumber(doubleVal)!;
        
            return stringValue
        

        }

        将字符串转换为双精度

        func getDoubleFrom(textField textField: UITextField) -> Double
        {
            var doubleValue : Double = 0.0
        
            if let val = textField.text
            {
                let numberFormatter = NSNumberFormatter()
                numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
                let finalNumber = numberFormatter.numberFromString(val)
                doubleValue = (finalNumber?.doubleValue)!;
            }
        
            return doubleValue
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-10
          • 1970-01-01
          • 2019-03-24
          • 2020-10-28
          • 2016-02-21
          • 2022-01-19
          相关资源
          最近更新 更多