Специфікатор точного струнного формату в Swift


395

Нижче описано, як я б попередньо обрізав поплавок до двох знаків після коми

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

Я перевірив документи та електронну книгу, але не зміг це зрозуміти. Дякую!

Відповіді:


277

Моє найкраще рішення досі, виходячи з відповіді Девіда :

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

Я думаю, що це найбільш швидке рішення, яке нагадує Swift, пов’язуючи операції з форматування безпосередньо до типу даних. Цілком може бути, що десь є вбудована бібліотека операцій форматування, а може вона скоро вийде. Майте на увазі, що мова все ще знаходиться в бета-версії.


76
Це зайво складно. відповідь realityone працює і набагато більш стислою.
Стівен Марлоу

9
Звичайно, якщо ви використовуєте його лише один раз. Але якщо ви хочете мати більше варіантів форматування, використовуючи строкову інтерполяцію (що набагато читабельніше), тоді ви можете помістити всі розширення форматування у файл в іншому місці та посилатись на нього протягом свого проекту. Звичайно, в ідеалі Apple повинна надавати бібліотеку форматування.
Антон Челаков

2
Це рішення не працюватиме у Swift 1.2, не передаючи результат на String.
ibesora

Гарний, але не Swift 2 Друг.
LastMove

798

простий спосіб:

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

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

9
println(String(format: "a float number: %.5f", 1.0321))
zaph

78
Я вважаю, що це краща відповідь, ніж прийнята відповідь. Це набагато ближче до стандартного стилю c printfбез необхідності писати окремі розширення.
Кіт Морріс

9
Не забудьте "імпортний фонд" у верхній частині файлу.
Кріс Грегг

3
Це краще, ніж прийнята відповідь, але все ще використовується методами Фундації (з'єднані з Swift).

1
Обов’язковоimport Foundation
NaN

125

Я виявив, String.localizedStringWithFormatщо працює досить добре:

Приклад:

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

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

Питання не має нічого спільного з поводженням з агрегатами. localizedStringWithFormat є приємним, але не пов'язаним.
АмітП

Я погоджуюся з AmitP, його було задано перед String (формат: ..., аргументи: ...) був доступний
Валентин

84

Це дуже швидкий і простий спосіб, який не потребує складного рішення.

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

Це не компілюється (використовуючи 3.0.2 в пісочній скриньці IBM):Col 16: 'init' has been renamed to 'init(describing:)'
Пітер Діллінгер

@PeterDillinger ви передаєте необов’язковий замість розпакованого значення.
Майкл

63

Більшість відповідей тут справедливі. Однак, якщо ви будете часто форматувати число, подумайте про розширення класу 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)"
    }
}

12
Я б хотів, щоб більше людей використовували NSNumberFormatter, як ця відповідь. Інші відповіді з високою оцінкою просто не відображають налаштування місцевості пристрою (наприклад, у деяких місцевостях вони використовують коми через десяткове місце; це відображає це; інші відповіді не відповідають).
Роб

3
Єдине поліпшення, яке я хотів би побачити, - це зберігання форматера для будь-якого заданого числа - NSNumberFormatters дорого побудувати.
Кендалл Гельмстеттер Гелнер

1
саме те, що я шукав! Спасибі
пістолет-стрілець

Я знаю, що це дещо давнє питання, але NSNumberFormatterініціалізувати досить повільно. Якщо можливо, це допомагає визначити його та повторно використовувати його. Це сказав, що я читаю це питання, тому що це неможливо в моєму випадку.
промакузер

44

Ви не можете зробити це (поки) за допомогою інтерполяції рядків. Найбільша ставка все ще буде форматуванням NSString:

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

Екстраполюючи з python, здається, що розумним синтаксисом може бути:

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

Що потім дозволяє використовувати їх як:

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

Ви можете визначити подібні оператори для всіх числових типів, на жаль, я не знайшов способу зробити це за допомогою дженериків.

Швидке оновлення 5

Як мінімум, Swift 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"

де ви знайшли той синтаксис `NSString (формат:" formatString ", val)". Я не бачу цього в документі iBooks від Apple.
Данкан C

1
Це те саме, що з швидкої побудови будь-якого об’єкта-c. Це швидка версія[NSString stringWithFormat...
Девід Беррі

Готча. Я ще не зайшов у Swift iBook.
Дункан C

IIRC, який не був у Swift iBook. Це було на одній із сесій WWDC. Швидка сумісність у глибині
ahruss

2
Якщо ви реалізовували%, як у Python, це повинно бути навпаки. "% 5.3f"% M_PI
Енді Дент

16

Чому це зробити так складно? Ви можете використовувати це замість:

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.

PS: Рішення від: http://rrike.sh/xcode/rounding-various-decimal-places-swift/


Це, безумовно, найкраще рішення, я не розумію, як це не на вершині.
pjtnt11

7
нітроподібна річ .. 1.500000000 буде лише "1,5", а не "1,50"
styler1972

13
import Foundation

extension CGFloat {
    var string1: String {
        return String(format: "%.1f", self)
    }
    var string2: String {
        return String(format: "%.2f", self)
    }
}

Використання

let offset = CGPoint(1.23, 4.56)
print("offset: \(offset.x.string1) x \(offset.y.string1)")
// offset: 1.2 x 4.6

10

Більш елегантне і загальне рішення - переписати %оператор ruby / python :

// Updated for beta 5
func %(format:String, args:[CVarArgType]) -> String {
    return NSString(format:format, arguments:getVaList(args))
}

"Hello %@, This is pi : %.2f" % ["World", M_PI]

На жаль, це вмирає в бета-версії 6: фатальна помилка: не може бути небезпечноюBitCast між типами різних розмірів.
бінармочі

@binarymochi З Beta 6: "Hello %@, This is pi : %.2f" % ["World", M_PI]працює, але дивно "%@ %@" % ["Hello", "World"]піднімає can't unsafeBitCast... Здогадайтесь, що буде виправлено у наступній версії.
Вінсент Герчі

Чи можете ви зробити "," у використаний оператор? '@infix func, (...', а потім запишіть рядки типу "Привіт% @, це pi:% .2f", ["ти", M_PI])?
Рік

@ Rick no you don't, ,не є дійсним оператором символів на Swift та більшості мов. І imo, краще використовувати %оператор, який вже існує іншими мовами. Дивіться developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Vincent Guerci

8

Швидкий 4

let string = String(format: "%.2f", locale: Locale.current, arguments: 15.123)

нехай temp: Float = div * 100 let string = String (формат: "% .2f", locale: Locale.current, аргументи: temp), це дає мені помилку. Неможливо перетворити значення типу "Float" у очікуваний тип аргументу "[CVarArg]
Chandni

вам потрібно покласти цей 15.123 в масив, щоб він працював
Доріан Рой,

3
для мене працює: нехай string = String (формат: "% .2f", myString)
Гжегож Р. Кулеша

6

Ви все ще можете використовувати NSLog як у Swift, так і в Objective-C лише без знаку @.

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

Редагувати: Після деякої роботи з Swift я хотів би додати і цю варіацію

    var r=1.2
    var g=1.3
    var b=1.4
    NSLog("\(r) \(g) \(b)")

Вихід:

2014-12-07 21:00:42.128 MyApp[1626:60b] 1.2 1.3 1.4

6

Деталі

  • Xcode 9.3, Swift 4.1
  • Xcode 10.2.1 (10E1001), Swift 5

Рішення 1

func округлий () -> Подвійний

(5.2).rounded()
// 5.0
(5.5).rounded()
// 6.0
(-5.2).rounded()
// -5.0
(-5.5).rounded()
// -6.0

func округлий (_ правило: FloatingPointRoundingRule) -> Double

let x = 6.5

// Equivalent to the C 'round' function:
print(x.rounded(.toNearestOrAwayFromZero))
// Prints "7.0"

// Equivalent to the C 'trunc' function:
print(x.rounded(.towardZero))
// Prints "6.0"

// Equivalent to the C 'ceil' function:
print(x.rounded(.up))
// Prints "7.0"

// Equivalent to the C 'floor' function:
print(x.rounded(.down))
// Prints "6.0"

вимкнення функції func ()

var x = 5.2
x.round()
// x == 5.0
var y = 5.5
y.round()
// y == 6.0
var z = -5.5
z.round()
// z == -6.0

вимкнення функції func round (_ правило: FloatingPointRoundingRule)

// Equivalent to the C 'round' function:
var w = 6.5
w.round(.toNearestOrAwayFromZero)
// w == 7.0

// Equivalent to the C 'trunc' function:
var x = 6.5
x.round(.towardZero)
// x == 6.0

// Equivalent to the C 'ceil' function:
var y = 6.5
y.round(.up)
// y == 7.0

// Equivalent to the C 'floor' function:
var z = 6.5
z.round(.down)
// z == 6.0

Рішення 2

extension Numeric {

    private func _precision(number: NSNumber, formatter: NumberFormatter) -> Self? {
        if  let formatedNumString = formatter.string(from: number),
            let formatedNum = formatter.number(from: formatedNumString) {
                return formatedNum as? Self
        }
        return nil
    }

    private func toNSNumber() -> NSNumber? {
        if let num = self as? NSNumber { return num }
        guard let string = self as? String, let double = Double(string) else { return nil }
        return NSNumber(value: double)
    }

    func precision(_ minimumFractionDigits: Int,
                   roundingMode: NumberFormatter.RoundingMode = NumberFormatter.RoundingMode.halfUp) -> Self? {
        guard let number = toNSNumber() else { return nil }
        let formatter = NumberFormatter()
        formatter.minimumFractionDigits = minimumFractionDigits
        formatter.roundingMode = roundingMode
        return _precision(number: number, formatter: formatter)
    }

    func precision(with numberFormatter: NumberFormatter) -> String? {
        guard let number = toNSNumber() else { return nil }
        return numberFormatter.string(from: number)
    }
}

Використання

_ = 123.44.precision(2)
_ = 123.44.precision(3, roundingMode: .up)

let numberFormatter = NumberFormatter()
numberFormatter.minimumFractionDigits = 1
numberFormatter.groupingSeparator = " "
let num = 222.3333
_ = num.precision(2)

Повний зразок

func option1<T: Numeric>(value: T, numerFormatter: NumberFormatter? = nil) {
    print("Type: \(type(of: value))")
    print("Original Value: \(value)")
    let value1 = value.precision(2)
    print("value1 = \(value1 != nil ? "\(value1!)" : "nil")")
    let value2 = value.precision(5)
    print("value2 = \(value2 != nil ? "\(value2!)" : "nil")")
    if let value1 = value1, let value2 = value2 {
        print("value1 + value2 = \(value1 + value2)")
    }
    print("")
}

func option2<T: Numeric>(value: T, numberFormatter: NumberFormatter) {
    print("Type: \(type(of: value))")
    print("Original Value: \(value)")
    let value1 = value.precision(with: numberFormatter)
    print("formated value = \(value1 != nil ? "\(value1!)" : "nil")\n")
}

func test(with double: Double) {
    print("===========================\nTest with: \(double)\n")
    let float = Float(double)
    let float32 = Float32(double)
    let float64 = Float64(double)
    let float80 = Float80(double)
    let cgfloat = CGFloat(double)

    // Exapmle 1
    print("-- Option1\n")
    option1(value: double)
    option1(value: float)
    option1(value: float32)
    option1(value: float64)
    option1(value: float80)
    option1(value: cgfloat)

    // Exapmle 2

    let numberFormatter = NumberFormatter()
    numberFormatter.formatterBehavior = .behavior10_4
    numberFormatter.minimumIntegerDigits = 1
    numberFormatter.minimumFractionDigits = 4
    numberFormatter.maximumFractionDigits = 9
    numberFormatter.usesGroupingSeparator = true
    numberFormatter.groupingSeparator = " "
    numberFormatter.groupingSize = 3

    print("-- Option 2\n")
    option2(value: double, numberFormatter: numberFormatter)
    option2(value: float, numberFormatter: numberFormatter)
    option2(value: float32, numberFormatter: numberFormatter)
    option2(value: float64, numberFormatter: numberFormatter)
    option2(value: float80, numberFormatter: numberFormatter)
    option2(value: cgfloat, numberFormatter: numberFormatter)
}

test(with: 123.22)
test(with: 1234567890987654321.0987654321)

Вихідні дані

===========================
Test with: 123.22

-- Option1

Type: Double
Original Value: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44

Type: Float
Original Value: 123.22
value1 = nil
value2 = nil

Type: Float
Original Value: 123.22
value1 = nil
value2 = nil

Type: Double
Original Value: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44

Type: Float80
Original Value: 123.21999999999999886
value1 = nil
value2 = nil

Type: CGFloat
Original Value: 123.22
value1 = 123.22
value2 = 123.22
value1 + value2 = 246.44

-- Option 2

Type: Double
Original Value: 123.22
formatted value = 123.2200

Type: Float
Original Value: 123.22
formatted value = 123.220001221

Type: Float
Original Value: 123.22
formatted value = 123.220001221

Type: Double
Original Value: 123.22
formatted value = 123.2200

Type: Float80
Original Value: 123.21999999999999886
formatted value = nil

Type: CGFloat
Original Value: 123.22
formatted value = 123.2200

===========================
Test with: 1.2345678909876544e+18

-- Option1

Type: Double
Original Value: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18

Type: Float
Original Value: 1.234568e+18
value1 = nil
value2 = nil

Type: Float
Original Value: 1.234568e+18
value1 = nil
value2 = nil

Type: Double
Original Value: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18

Type: Float80
Original Value: 1234567890987654400.0
value1 = nil
value2 = nil

Type: CGFloat
Original Value: 1.2345678909876544e+18
value1 = 1.23456789098765e+18
value2 = 1.23456789098765e+18
value1 + value2 = 2.4691357819753e+18

-- Option 2

Type: Double
Original Value: 1.2345678909876544e+18
formatted value = 1 234 567 890 987 650 000.0000

Type: Float
Original Value: 1.234568e+18
formatted value = 1 234 567 939 550 610 000.0000

Type: Float
Original Value: 1.234568e+18
formatted value = 1 234 567 939 550 610 000.0000

Type: Double
Original Value: 1.2345678909876544e+18
formatted value = 1 234 567 890 987 650 000.0000

Type: Float80
Original Value: 1234567890987654400.0
formatted value = nil

Type: CGFloat
Original Value: 1.2345678909876544e+18
formatted value = 1 234 567 890 987 650 000.0000

4
extension Double {
  func formatWithDecimalPlaces(decimalPlaces: Int) -> Double {
     let formattedString = NSString(format: "%.\(decimalPlaces)f", self) as String
     return Double(formattedString)!
     }
 }

 1.3333.formatWithDecimalPlaces(2)

3

Надані відповіді, що отримали найбільше голосів, покладаються на методи NSString і вимагають, щоб ви імпортували Foundation.

Зробивши це, ви все ще маєте доступ до NSLog.

Тому я думаю, що відповідь на питання, якщо ви запитуєте, як продовжувати використовувати NSLog в Swift, - це просто:

import Foundation


3
//It will more help, by specify how much decimal Point you want.
let decimalPoint = 2
let floatAmount = 1.10001
let amountValue = String(format: "%0.*f", decimalPoint, floatAmount)

2

тут "чисте" швидке рішення

 var d = 1.234567
operator infix ~> {}
@infix func ~> (left: Double, right: Int) -> String {
    if right == 0 {
        return "\(Int(left))"
    }
    var k = 1.0
    for i in 1..right+1 {
        k = 10.0 * k
    }
    let n = Double(Int(left*k)) / Double(k)
    return "\(n)"
}
println("\(d~>2)")
println("\(d~>1)")
println("\(d~>0)")

2

Потужність розширення

extension Double {
    var asNumber:String {
        if self >= 0 {
            var formatter = NSNumberFormatter()
            formatter.numberStyle = .NoStyle
            formatter.percentSymbol = ""
            formatter.maximumFractionDigits = 1
            return "\(formatter.stringFromNumber(self)!)"
        }
        return ""
    }
}

let velocity:Float = 12.32982342034

println("The velocity is \(velocity.toNumber)")

Вихід: Швидкість - 12,3


2

менш введений спосіб:

func fprint(format: String, _ args: CVarArgType...) {
    print(NSString(format: format, arguments: getVaList(args)))
}

1

Ви також можете створити оператора таким чином

operator infix <- {}

func <- (format: String, args:[CVarArg]) -> String {
    return String(format: format, arguments: args)
}

let str = "%d %.1f" <- [1453, 1.123]

1

Також з округленням:

extension Float
{
    func format(f: String) -> String
    {
        return NSString(format: "%\(f)f", self)
    }
    mutating func roundTo(f: String)
    {
        self = NSString(format: "%\(f)f", self).floatValue
    }
}

extension Double
{
    func format(f: String) -> String
    {
        return NSString(format: "%\(f)f", self)
    }
    mutating func roundTo(f: String)
    {
        self = NSString(format: "%\(f)f", self).doubleValue
    }
}

x = 0.90695652173913
x.roundTo(".2")
println(x) //0.91

1

використання нижче методу

let output = String.localizedStringWithFormat(" %.02f %.02f %.02f", r, g, b)

println(output)

1

Версія оператора ruby ​​/ python% Vincent Guerci, оновлена ​​для Swift 2.1:

func %(format:String, args:[CVarArgType]) -> String {
  return String(format:format, arguments:args)
}

"Hello %@, This is pi : %.2f" % ["World", M_PI]

1

Вище хороших відповідей вище, але іноді візерунок є більш доцільним, ніж "% .3f" сорт гоблі. Ось мій досвід використання NumberFormatter у Swift 3.

extension Double {
  func format(_ pattern: String) -> String {
    let formatter = NumberFormatter()
    formatter.format = pattern
    return formatter.string(from: NSNumber(value: self))!
  }    
}

let n1 = 0.350, n2 = 0.355
print(n1.format("0.00#")) // 0.35
print(n2.format("0.00#")) // 0.355

Тут я хотів, щоб завжди було показано 2 десяткові знаки, але третій, лише якщо це не було нуля.


1

Швидке оновлення 4 Xcode 10

extension Double {
    var asNumber:String {
        if self >= 0 {
            let formatter = NumberFormatter()
            formatter.numberStyle = .none
            formatter.percentSymbol = ""
            formatter.maximumFractionDigits = 2
            return "\(formatter.string(from: NSNumber(value: self)) ?? "")"
        }
        return ""
    }
}

1

Як щодо розширень для типів Double та CGFloat:

extension Double {

   func formatted(_ decimalPlaces: Int?) -> String {
      let theDecimalPlaces : Int
      if decimalPlaces != nil {
         theDecimalPlaces = decimalPlaces!
      }
      else {
         theDecimalPlaces = 2
      }
      let theNumberFormatter = NumberFormatter()
      theNumberFormatter.formatterBehavior = .behavior10_4
      theNumberFormatter.minimumIntegerDigits = 1
      theNumberFormatter.minimumFractionDigits = 1
      theNumberFormatter.maximumFractionDigits = theDecimalPlaces
      theNumberFormatter.usesGroupingSeparator = true
      theNumberFormatter.groupingSeparator = " "
      theNumberFormatter.groupingSize = 3

      if let theResult = theNumberFormatter.string(from: NSNumber(value:self)) {
         return theResult
      }
      else {
         return "\(self)"
      }
   }
}

Використання:

let aNumber: Double = 112465848348508.458758344
Swift.print("The number: \(aNumber.formatted(2))")

принти: 112 465 848 348 508,46


0
@infix func ^(left:Double, right: Int) -> NSNumber {
    let nf = NSNumberFormatter()
    nf.maximumSignificantDigits = Int(right)
    return  nf.numberFromString(nf.stringFromNumber(left))
}


let r = 0.52264
let g = 0.22643
let b = 0.94837

println("this is a color: \(r^3) \(g^3) \(b^3)")

// this is a color: 0.523 0.226 0.948

0

Я не знаю про два десяткових знаки, але ось як можна друкувати поплавці з нульовими десятковими знаками, тому я думаю, що це може бути 2 місце, 3, місця ... (Примітка: ви повинні перетворити CGFloat в Double, щоб пройти до String (формат :) або він побачить значення нуля)

func logRect(r: CGRect, _ title: String = "") {
    println(String(format: "[ (%.0f, %.0f), (%.0f, %.0f) ] %@",
        Double(r.origin.x), Double(r.origin.y), Double(r.size.width), Double(r.size.height), title))
}


-1

@Christian Dietrich:

замість:

var k = 1.0
    for i in 1...right+1 {
        k = 10.0 * k
    }
let n = Double(Int(left*k)) / Double(k)
return "\(n)"

це також може бути:

let k = pow(10.0, Double(right))
let n = Double(Int(left*k)) / k
return "\(n)"

[виправлення:] Вибачте за плутанину * - Звичайно, це працює з дублями. Я думаю, що найпрактичніше (якщо ви хочете, щоб цифри були округленими, а не відрізаними), це було б щось подібне:

infix operator ~> {}
func ~> (left: Double, right: Int) -> Double {
    if right <= 0 {
        return round(left)
    }
    let k = pow(10.0, Double(right))
    return round(left*k) / k
}

Тільки для Float просто замініть Double на Float, pow на powf і круглий на Roundf.
Оновлення: я виявив, що найправильніше використовувати тип повернення Double замість String. Він працює так само і для String output, тобто:

println("Pi is roughly \(3.1415926 ~> 3)")

друкує: Pi становить приблизно 3.142,
тож ви можете використовувати його так само, як і для Strings (ви навіть можете ще написати: println (d ~> 2)), але додатково ви також можете використовувати його для прямого округлення значень, тобто:

d = Double(slider.value) ~> 2

або все, що вам потрібно ...


Це, очевидно, призначене для коментаря, я розумію, що вам потрібно більше місця, щоб зробити точку, і це цінно, але якщо ви збираєтесь писати це як повноцінна відповідь, зробіть це корисним самостійно; Ви можете, наприклад, додати повний код, а потім зауваження та підтвердити Крістіану.
Хайме Гомес

@Jaime Gómez: Мені заборонено коментувати вищезгадану відповідь. Але в будь-якому випадку, у мене були деякі помилкові тлумачення *. Не знаю, чи варто його зберігати чи його слід видалити. Звичайно, це можна використати аналогічно для округлення (без конвертації рядків) і легко перекласти на інші мови програмування. * Я припускав, що з Double він округляється до приблизно 8 цифр, що, звичайно, було помилкою, тому що я обійшов його з Float і перетворив це на Double несподівано.
Stuepfnick

PS: Я вважаю за краще використовувати подібні методи більше для округлення в цілому, а не String виводу, тому поверніть тип Double (і звичайний метод?) Sidenote : Якщо ви округляєте Float таким чином (тобто зі слайдера), а результат - String it буде добре, як "0.1", але якщо перетворити цей Float в Double і потім в String *, це буде: "0.100000001490116", оскільки Float не здатний точно зберігати 0,1, тільки дуже близько. Я думаю, що це саме з Double, тільки з подвійною точністю ;) Тому завжди конвертуйте в Double перед округленням, тож воно буде максимально точним і перетворюється на String також.
Stuepfnick

PPS: Звичайно, з типом Return Type Double іноді це дещо інакше, тобто якщо вам потрібно встановити текст мітки, вам потрібно написати: myLabel.text = "\ (d ~> 2)" замість просто: myLabel. text = d ~> 2 , але я все ще думаю, що функція є більш практичною саме таким чином. (звичайно, кожен може робити, що хоче, лише мої думки ...)
Stuepfnick

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.