小数点以下1桁の距離を表示していますが、この小数点以下が0(例:1200.0Km)の場合は削除したいのですが、どうすれば迅速に実行できますか?私はこの番号を次のように表示しています:
let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: "%.1f", distanceFloat) + "Km"
回答:
スウィフト3/4:
var distanceFloat1: Float = 5.0
var distanceFloat2: Float = 5.540
var distanceFloat3: Float = 5.03
extension Float {
var clean: String {
return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
}
}
print("Value \(distanceFloat1.clean)") // 5
print("Value \(distanceFloat2.clean)") // 5.54
print("Value \(distanceFloat3.clean)") // 5.03
スイフト2(元の回答)
let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
distanceLabel.text = String(format: distanceFloat == floor(distanceFloat) ? “%.0f" : "%.1f", distanceFloat) + "Km"
または拡張として:
extension Float {
var clean: String {
return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
}
}
distanceFloat = floor(distanceFloat * 10) / 10
、そしてそれは完璧に機能しました、ありがとう:)
NSNumberFormatterを使用します。
let formatter = NumberFormatter()
formatter.minimumFractionDigits = 0
formatter.maximumFractionDigits = 2
// Avoid not getting a zero on numbers lower than 1
// Eg: .5, .67, etc...
formatter.numberStyle = .decimal
let nums = [3.0, 5.1, 7.21, 9.311, 600.0, 0.5677, 0.6988]
for num in nums {
print(formatter.string(from: num as NSNumber) ?? "n/a")
}
戻り値:
3
5.1
7.21
9.31
600
0.57
0.7
let formatter = NumberFormatter() formatter.minimumFractionDigits = 0 formatter.maximumFractionDigits = 1 statLabel.text = formatter.string(from: value as NSNumber) ?? "n/a"
formatter.numberStyle = .decimal
.decimal
。numberStyleを追加しないと、1未満の数値はゼロなしで表示されます。例:.5、.78など...今すぐ回答を編集しています。
extension
それを行うための強力な方法です。
拡張機能:
Swift 2のコード(Swift 3以降ではない):
extension Float {
var cleanValue: String {
return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
}
}
使用法:
var sampleValue: Float = 3.234
print(sampleValue.cleanValue)
3.234
sampleValue = 3.0
print(sampleValue.cleanValue)
3
sampleValue = 3
print(sampleValue.cleanValue)
3
Playgroundファイルのサンプルはこちらです。
迅速な3の受け入れられた回答の更新:
extension Float
{
var cleanValue: String
{
return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(self)
}
}
使用法は次のようになります。
let someValue: Float = 3.0
print(someValue.cleanValue) //prints 3
文字列にフォーマットするには、このパターンに従ってください
let aFloat: Float = 1.123
let aString: String = String(format: "%.0f", aFloat) // "1"
let aString: String = String(format: "%.1f", aFloat) // "1.1"
let aString: String = String(format: "%.2f", aFloat) // "1.12"
let aString: String = String(format: "%.3f", aFloat) // "1.123"
Intにキャストするには、このパターンに従います
let aInt: Int = Int(aFloat) // "1"
String(format:
初期化子を使用すると、Swiftは次の数値に基づいて必要に応じて最後の桁を自動的に丸めます。
すでに述べたように拡張機能を使用できますが、このソリューションは少し短いです:
extension Float {
var shortValue: String {
return String(format: "%g", self)
}
}
使用例:
var sample: Float = 3.234
print(sample.shortValue)
0.00000001
ます。pubs.opengroup.org/onlinepubs/009695399/functions/printf.htmlの%gのドキュメントを参照してください: "使用されるスタイルは、変換された値によって異なります。スタイルe(またはE)は、そのような変換の結果の指数が使用される場合にのみ使用されます。以下より-4以上または精度に等しい。 "
Swift4ではこれを試してください。
extension CGFloat{
var cleanValue: String{
//return String(format: 1 == floor(self) ? "%.0f" : "%.2f", self)
return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(format: "%.2f", self)//
}
}
//使用方法-(。)ポイントの後に2文字以上入力すると、最後の文字が自動的にトリミングされ、ポイントの後に2文字しか表示されません。
let strValue = "32.12"
print(\(CGFloat(strValue).cleanValue)
1.1
:出力はになります"1.10"
。
NSNumberFormatterはあなたの友達です
let distanceFloat: Float = (currentUser.distance! as NSString).floatValue
let numberFormatter = NSNumberFormatter()
numberFormatter.positiveFormat = "###0.##"
let distance = numberFormatter.stringFromNumber(NSNumber(float: distanceFloat))!
distanceLabel.text = distance + " Km"
このシナリオは、カスタム出力精度が必要な場合に適しています。このソリューションは、MirekEのNumberFormatter + NSNumberソリューションとほぼ同じくらい高速に見えますが、1つの利点は、ここでNSObjectを回避していることです。
extension Double {
func string(maximumFractionDigits: Int = 2) -> String {
let s = String(format: "%.\(maximumFractionDigits)f", self)
var offset = -maximumFractionDigits - 1
for i in stride(from: 0, to: -maximumFractionDigits, by: -1) {
if s[s.index(s.endIndex, offsetBy: i - 1)] != "0" {
offset = i
break
}
}
return String(s[..<s.index(s.endIndex, offsetBy: offset)])
}
}
(で動作しますextension Float
が、macOSのみのタイプでは動作しませんFloat80
)
使用法:myNumericValue.string(maximumFractionDigits: 2)
またはmyNumericValue.string()
の出力maximumFractionDigits: 2
:
1.0→「1」
0.12→「0.12」
0.012→「0.01」
0.0012→「0」
0.00012→「0」
これが完全なコードです。
let numberA: Float = 123.456
let numberB: Float = 789.000
func displayNumber(number: Float) {
if number - Float(Int(number)) == 0 {
println("\(Int(number))")
} else {
println("\(number)")
}
}
displayNumber(numberA) // console output: 123.456
displayNumber(numberB) // console output: 789
これが最も重要な行の詳細です。
func displayNumber(number: Float) {
Int(number)
。で削除します。Float(Int(number))
。number - Float(Int(number))
if number - Float(Int(number)) == 0
ifおよびelseステートメント内の内容を説明する必要はありません。
String
代わりに関数を返すようにしprintln(result)
ますreturn result
。これがお役に立てば幸いです。
これも役立つかもしれません。
extension Float {
func cleanValue() -> String {
let intValue = Int(self)
if self == 0 {return "0"}
if self / Float (intValue) == 1 { return "\(intValue)" }
return "\(self)"
}
}
使用法:
let number:Float = 45.23230000
number.cleanValue()
多分stringByReplacingOccurrencesOfString
あなたを助けることができます:)
let aFloat: Float = 1.000
let aString: String = String(format: "%.1f", aFloat) // "1.0"
let wantedString: String = aString.stringByReplacingOccurrencesOfString(".0", withString: "") // "1"
1.05
実行String(format: "%.1f", aFloat)
されます1.0
、動作します。場合1.05
に実行することString(format: "%.2f", aFloat)
になり1.05
、これを行う必要がありますよりstringByReplacingOccurrencesOfString(".00"...)