[swift] 스위프트의 정밀 문자열 형식 지정자

아래는 이전에 소수점을 소수점 이하 두 자리로 자른 방법입니다.

NSLog(@" %.02f %.02f %.02f", r, g, b);

문서와 eBook을 확인했지만 확인할 수 없었습니다. 감사!



답변

David의 답변에 따라 지금까지 가장 좋은 해결책은 다음과 같습니다 .

import Foundation

extension Int {
    func format(f: String) -> String {
        return String(format: "%\(f)d", self)
    }
}

extension Double {
    func format(f: String) -> String {
        return String(format: "%\(f)f", self)
    }
}

let someInt = 4, someIntFormat = "03"
println("The integer number \(someInt) formatted with \"\(someIntFormat)\" looks like \(someInt.format(someIntFormat))")
// The integer number 4 formatted with "03" looks like 004

let someDouble = 3.14159265359, someDoubleFormat = ".3"
println("The floating point number \(someDouble) formatted with \"\(someDoubleFormat)\" looks like \(someDouble.format(someDoubleFormat))")
// The floating point number 3.14159265359 formatted with ".3" looks like 3.142

나는 이것이 포맷 작업을 데이터 유형에 직접 연결하는 가장 신속한 솔루션이라고 생각합니다. 어딘가에 서식 작업 라이브러리가 내장되어 있거나 곧 출시 될 수 있습니다. 언어는 아직 베타 버전입니다.


답변

간단한 방법은 다음과 같습니다.

import Foundation // required for String(format: _, _)

print(String(format: "hex string: %X", 123456))
print(String(format: "a float number: %.5f", 1.0321))


답변

나는 String.localizedStringWithFormat꽤 잘 작동하는 것을 발견 했다.

예:

let value: Float = 0.33333
let unit: String = "mph"

yourUILabel.text = String.localizedStringWithFormat("%.2f %@", value, unit)


답변

이것은이다 매우 신속 하고 간단하게 복잡한 솔루션을 필요로하지 않는 방법입니다.

let duration = String(format: "%.01f", 3.32323242)
// result = 3.3


답변

여기에 대부분의 답변이 유효합니다. 그러나 숫자를 자주 포맷하는 경우 Float 클래스를 확장하여 포맷 된 문자열을 반환하는 메서드를 추가하는 것이 좋습니다. 아래 예제 코드를 참조하십시오. 이것은 숫자 포맷터와 확장자를 사용하여 동일한 목표를 달성합니다.

extension Float {
    func string(fractionDigits:Int) -> String {
        let formatter = NSNumberFormatter()
        formatter.minimumFractionDigits = fractionDigits
        formatter.maximumFractionDigits = fractionDigits
        return formatter.stringFromNumber(self) ?? "\(self)"
    }
}

let myVelocity:Float = 12.32982342034

println("The velocity is \(myVelocity.string(2))")
println("The velocity is \(myVelocity.string(1))")

콘솔은 다음을 보여줍니다 :

The velocity is 12.33
The velocity is 12.3

SWIFT 3.1 업데이트

extension Float {
    func string(fractionDigits:Int) -> String {
        let formatter = NumberFormatter()
        formatter.minimumFractionDigits = fractionDigits
        formatter.maximumFractionDigits = fractionDigits
        return formatter.string(from: NSNumber(value: self)) ?? "\(self)"
    }
}


답변

문자열 보간으로는 아직 할 수 없습니다. 가장 좋은 방법은 여전히 ​​NSString 형식입니다.

println(NSString(format:"%.2f", sqrt(2.0)))

파이썬에서 외삽하면 합리적인 구문처럼 보입니다.

@infix func % (value:Double, format:String) -> String {
    return NSString(format:format, value)
}

그러면 다음과 같이 사용할 수 있습니다.

M_PI % "%5.3f"                // "3.142"

모든 숫자 유형에 대해 유사한 연산자를 정의 할 수 있지만 불행하게도 제네릭으로 수행하는 방법을 찾지 못했습니다.

스위프트 5 업데이트

스위프트 (5)는, 적어도 현재 String직접 지원 format:이니셜 때문에 사용할 필요가 없다 NSString@infix속성은 더 이상으로 작성해야 위의 샘플을 의미하는 필요합니다 :

println(String(format:"%.2f", sqrt(2.0)))

func %(value:Double, format:String) -> String {
    return String(format:format, value)
}

Double.pi % "%5.3f"         // "3.142"


답변

왜 그렇게 복잡하게 만드나요? 대신 이것을 사용할 수 있습니다 :

import UIKit

let PI = 3.14159265359

round( PI ) // 3.0 rounded to the nearest decimal
round( PI * 100 ) / 100 //3.14 rounded to the nearest hundredth
round( PI * 1000 ) / 1000 // 3.142 rounded to the nearest thousandth

Playground에서 작동하는지 확인하십시오.

추신 : 솔루션 : http://rrike.sh/xcode/rounding-various-decimal-places-swift/