使用NSDecimalNumber输出防止科学记数法作为NSString

时间:2012-01-13 22:21:11

标签: objective-c c gnustep nsdecimalnumber

我有一个类似于这个问题的问题: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的建议。

4 个答案:

答案 0 :(得分:2)

您应该查看NSNumberFormatter

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

(我假设NSUumberFormatter在GNUstep上可用)

答案 3 :(得分:0)

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

将Double转换为String

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

}

将字符串转换为Double

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
}