简体   繁体   中英

How do I extract any number of digits after the decimal point of a Float and convert it to a String in Swift?

Basically, I have a Float , for example: 3.511054256.

How can I extract n number of digits after the decimal point?

ie I'd like to retrieve 0.51, 0.511, 0.5110 or etc.

I know I can easily achieve something like this:

var temp: Float = 3.511054256
var aStr = String(format: "%f", temp)

var arr: [AnyObject] = aStr.componentsSeparatedByString(".")

var tempInt: Int = Int(arr.last as! String)!

However, this gives me 511054 . I'd like the option of retrieving any number of digits past the decimal point easily.

For a task I'm doing, I only need to retrieve the first 2 digits after the decimal point, but less restriction would be ideal.

Thanks.

You can specify the number of decimal digits, say N , in your format specifier as %.Nf , eg, for 5 decimal digits, %.5f .

let temp: Float = 3.511054256
let aStr = String(format: "%.5f", temp).componentsSeparatedByString(".").last ?? "Unexpected"
print(aStr) // 51105

Alternatively, for a more dynamic usage, make use of an NSNumberFormatter :

/* Use NSNumberFormatter to extract specific number
   of decimal digits from your float  */
func getFractionDigitsFrom(num: Float, inout withFormatter f: NSNumberFormatter,
        forNumDigits numDigits: Int) -> String {
    f.maximumFractionDigits = numDigits
    f.minimumFractionDigits = numDigits
    let localeDecSep = f.decimalSeparator
    return f.stringFromNumber(num)?.componentsSeparatedByString(localeDecSep).last ?? "Unexpected"
}

/* Example usage */
var temp: Float = 3.511054256
var formatter = NSNumberFormatter()
let aStr = getFractionDigitsFrom(temp, withFormatter: &formatter, forNumDigits: 5)
print(aStr) // 51105

Note that both solutions above will perform rounding; eg, if var temp: Float = 3.519 , then asking for 2 decimal digits will produce "52" . If you really intend to treat your float temp purely as a String (with no rounding whatsoever), you could solve this using just String methods, eg

/* Just treat input as a string with known format rather than a number */
func getFractionDigitsFrom(num: Float, forNumDigits numDigits: Int) -> String {
    guard let foo = String(temp).componentsSeparatedByString(".").last
        where foo.characters.count >= numDigits else {
        return "Invalid input" // or return nil, for '-> String?' return
    }
    return foo.substringWithRange(foo.startIndex..<foo.startIndex.advancedBy(numDigits))
}

/* Example usage */
let temp: Float = 3.5199
let aStr = getFractionDigitsFrom(temp, forNumDigits: 2) // 51

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM