Arrotondamento di un doppio valore a x numero di posizioni decimali in rapido


395

Qualcuno può dirmi come arrotondare un doppio valore al numero x di decimali in Swift?

Io ho:

var totalWorkTimeInHours = (totalWorkTime/60/60)

Con l' totalWorkTimeessere un NSTimeInterval (doppio) al secondo.

totalWorkTimeInHours mi darà le ore, ma mi dà la quantità di tempo in un numero così lungo preciso es. 1.543240952039 ......

Come posso arrotondare questo, per esempio, a 1.543 quando stampo totalWorkTimeInHours?


1
Vedere la mia risposta per trovare fino a 9 diversi modi per arrotondare un doppio utilizzando Darwin round(_:), Double round(), NSStringinitializer, Stringinitializer, NumberFormatter, Doppio allungamento o anche NSDecimalNumbere Decimal.
Imanou Petit,

@Rounded, un rapido wrapper di proprietà 5.1: gist.github.com/abhijithpp/1cc41b41a5d1c8f007da90f20bc0c65f
Abhijith

Risposte:


389

È possibile utilizzare la roundfunzione di Swift per ottenere questo risultato.

Per arrotondare un Doublecon precisione a 3 cifre, prima moltiplicalo per 1000, arrotondalo e dividi il risultato arrotondato per 1000:

let x = 1.23556789
let y = Double(round(1000*x)/1000)
print(y)  // 1.236

A parte qualsiasi tipo di printf(...)o String(format: ...)soluzioni, il risultato di questa operazione è ancora di tipo Double.

EDIT: per
quanto riguarda i commenti che a volte non funziona, leggi questo:

Ciò che ogni programmatore dovrebbe sapere sull'aritmetica in virgola mobile


Per alcuni motivi non aiuta .. Sto usando questo nel seguente caso TransformOf <Double, String> (fromJSON: {Double (round (($ 0! As NSString) .doubleValue * 100) / 100)}, toJSON: {"($ 0)"})
Fawkes,

29
Non funziona per me nel parco giochi: let rate = 9.94999999999; Double(round(rate * 100) / 100);Output: 9.94999999999, 9.949999999999999funziona solo per la stampa ma come posso assegnarlo alla variabile?
Alexander Yakovlev,

Dovresti usare Decimal per questo, non semplici Double.
csotiriou,

13
"Ciò che ogni scienziato informatico dovrebbe sapere sull'aritmetica a virgola mobile" è lungo 73 pagine. Che cos'è il TL; DR su questo? :)
JaredH

1
@HardikDG Non ricordo, scusa :-)
Alexander Yakovlev il

431

Estensione per Swift 2

Una soluzione più generale è la seguente estensione, che funziona con Swift 2 e iOS 9:

extension Double {
    /// Rounds the double to decimal places value
    func roundToPlaces(places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return round(self * divisor) / divisor
    }
}


Estensione per Swift 3

In Swift 3 roundè sostituito da rounded:

extension Double {
    /// Rounds the double to decimal places value
    func rounded(toPlaces places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}


Esempio che restituisce Double arrotondato al 4 decimale:

let x = Double(0.123456789).roundToPlaces(4)  // x becomes 0.1235 under Swift 2
let x = Double(0.123456789).rounded(toPlaces: 4)  // Swift 3 version

17
La natura del Double di Swift sembra essere che può essere imprecisa - a causa del modo in cui è memorizzata / accessibile in binario, anche usando questa funzione di arrotondamento non si restituisce un numero arrotondato a 3 cifre decimali: ad esempio, round(8.46 * pow(10.0, 3.0)) / pow(10.0, 3.0)restituisce 8.460000000000001. Fare lo stesso con Float, almeno in questo scenario , sembra funzionare: i round(Float(8.46) * pow(10.0, 3.0)) / pow(10.0, 3.0)rendimenti 8.46. Solo qualcosa che vale la pena notare.
Ben Saufley,

2
Sfortunatamente, questo non funziona più in Swift 3, sto ricevendo questo erroreNo '*' candidates produce the expected contextual result type 'FloatingPointRoundingRule'
koen

2
Ho aggiornato la soluzione e aggiunto un'estensione per Swift 3.
Sebastian

2
Per essere più rapidi 3 ... dovresti cambiare per funzione arrotondata (a Posti di posto: Int) -> Doppio
FouZ

2
@BenSaufley Ma non funziona anche se inserisci 98.68. In questo caso, ottengo 98.6800003
Alexander Khitev il

340

Come posso arrotondare questo, per esempio, 1.543 quando stampo totalWorkTimeInHours?

Per arrotondare totalWorkTimeInHoursa 3 cifre per la stampa, utilizzare il Stringcostruttore che accetta una formatstringa:

print(String(format: "%.3f", totalWorkTimeInHours))

24
Questo è troncamento, non arrotondamento
Bulbo oculare

33
@Eyeball: in realtà, fa tondo. È lo stesso comportamento della funzionalità C printf, che viene arrotondata alle cifre richieste. Quindi String(format: "%.3f", 1.23489)stampa1.235
zisoft il

6
Il poster originale sta cercando un valore numerico da utilizzare, non una stringa da visualizzare.
pr1001,

17
@ pr1001, forse è così, ma non era chiaro al momento e altri 46 hanno trovato utile la mia risposta. Stack Overflow è molto più che aiutare l'OP.
vacawama,

3
strano, questo restituisce 0,00 ogni volta.
Eric H,

254

Con Swift 5, in base alle tue esigenze, puoi scegliere uno dei 9 seguenti stili per ottenere un risultato arrotondato da a Double.


# 1. Usando il FloatingPoint rounded()metodo

Nel caso più semplice, è possibile utilizzare il Double rounded()metodo

let roundedValue1 = (0.6844 * 1000).rounded() / 1000
let roundedValue2 = (0.6849 * 1000).rounded() / 1000
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 2. Usando il FloatingPoint rounded(_:)metodo

let roundedValue1 = (0.6844 * 1000).rounded(.toNearestOrEven) / 1000
let roundedValue2 = (0.6849 * 1000).rounded(.toNearestOrEven) / 1000
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 3. Utilizzo della roundfunzione Darwin

La Fondazione offre una roundfunzione tramite Darwin.

import Foundation

let roundedValue1 = round(0.6844 * 1000) / 1000
let roundedValue2 = round(0.6849 * 1000) / 1000
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 4. Utilizzo di un Doublemetodo personalizzato di estensione creato con Darwin rounde powfunzioni

Se si desidera ripetere più volte l'operazione precedente, il refactoring del codice può essere una buona idea.

import Foundation

extension Double {
    func roundToDecimal(_ fractionDigits: Int) -> Double {
        let multiplier = pow(10, Double(fractionDigits))
        return Darwin.round(self * multiplier) / multiplier
    }
}

let roundedValue1 = 0.6844.roundToDecimal(3)
let roundedValue2 = 0.6849.roundToDecimal(3)
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 5. Usando il NSDecimalNumber rounding(accordingToBehavior:)metodo

Se necessario, NSDecimalNumberoffre una soluzione dettagliata ma potente per arrotondare i numeri decimali.

import Foundation

let scale: Int16 = 3

let behavior = NSDecimalNumberHandler(roundingMode: .plain, scale: scale, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: true)

let roundedValue1 = NSDecimalNumber(value: 0.6844).rounding(accordingToBehavior: behavior)
let roundedValue2 = NSDecimalNumber(value: 0.6849).rounding(accordingToBehavior: behavior)

print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 6. Utilizzando la NSDecimalRound(_:_:_:_:)funzione

import Foundation

let scale = 3

var value1 = Decimal(0.6844)
var value2 = Decimal(0.6849)

var roundedValue1 = Decimal()
var roundedValue2 = Decimal()

NSDecimalRound(&roundedValue1, &value1, scale, NSDecimalNumber.RoundingMode.plain)
NSDecimalRound(&roundedValue2, &value2, scale, NSDecimalNumber.RoundingMode.plain)

print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 7. Utilizzando l' NSString init(format:arguments:)inizializzatore

Se si desidera restituire un NSStringdalla propria operazione di arrotondamento, l'uso NSStringdell'inizializzatore è una soluzione semplice ma efficace.

import Foundation

let roundedValue1 = NSString(format: "%.3f", 0.6844)
let roundedValue2 = NSString(format: "%.3f", 0.6849)
print(roundedValue1) // prints 0.684
print(roundedValue2) // prints 0.685

# 8. Utilizzando l' String init(format:_:)inizializzatore

Il Stringtipo di Swift è colmato con la NSStringclasse della Fondazione . Pertanto, è possibile utilizzare il seguente codice per restituire un Stringdalla propria operazione di arrotondamento:

import Foundation

let roundedValue1 = String(format: "%.3f", 0.6844)
let roundedValue2 = String(format: "%.3f", 0.6849)
print(roundedValue1) // prints 0.684
print(roundedValue2) // prints 0.685

# 9. utilizzandoNumberFormatter

Se ti aspetti di ottenere un risultato String?dalla tua operazione di arrotondamento, NumberFormatteroffre una soluzione altamente personalizzabile.

import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal
formatter.roundingMode = NumberFormatter.RoundingMode.halfUp
formatter.maximumFractionDigits = 3

let roundedValue1 = formatter.string(from: 0.6844)
let roundedValue2 = formatter.string(from: 0.6849)
print(String(describing: roundedValue1)) // prints Optional("0.684")
print(String(describing: roundedValue2)) // prints Optional("0.685")

1
Bella risposta. Potrei suggerire su # 5 che potresti prendere in considerazione l'utilizzo Decimal, che è a pedaggio gratuito NSDecimalNumber. Decimalè il tipo e offerte natale di Swift il supporto più elegante per gli operatori nativi come +, -e così via
Rob

@Rob Ho aggiornato la mia risposta con la NSDecimalRound(_:_:_:_:)funzione. Grazie.
Imanou Petit,

L'uso della scelta n. 9 ti garantirà che ti aspetti la frazione fissa (numero di cifre di precisione), diciamo il numero decimale 43.12345 e la frazione = 6, ottieni 43.123450
Almas Adilbek

1
@ImanouPetit Grazie per aver pubblicato questo. Posso aggiungere un paio di estensioni.
Adrian,

Sono triste NumberFormatterè l'ultima opzione mentre dovrebbe essere la prima per presentare numeri agli utenti. Nessun altro metodo genera numeri localizzati correttamente.
Sulthan,

93

In Swift 2.0 e Xcode 7.2:

let pi: Double = 3.14159265358979
String(format:"%.2f", pi)

Esempio:

inserisci qui la descrizione dell'immagine


50

Questo è un codice completamente funzionante

Swift 3.0 / 4.0 / 5.0, Xcode 9.0 GM / 9.2 e versioni successive

let doubleValue : Double = 123.32565254455
self.lblValue.text = String(format:"%.f", doubleValue)
print(self.lblValue.text)

uscita - 123

let doubleValue : Double = 123.32565254455
self.lblValue_1.text = String(format:"%.1f", doubleValue)
print(self.lblValue_1.text)

uscita - 123.3

let doubleValue : Double = 123.32565254455
self.lblValue_2.text = String(format:"%.2f", doubleValue)
print(self.lblValue_2.text)

uscita - 123.33

let doubleValue : Double = 123.32565254455
self.lblValue_3.text = String(format:"%.3f", doubleValue)
print(self.lblValue_3.text)

uscita - 123.326


1
una riga ?, sembra 3 righe;)
Petter Friberg,

non puoi calcolare le cose usando le stringhe, non credo sia una risposta corretta perché è solo per la visualizzazione.
JBarros35,

25

Sulla base della risposta di Yogi, ecco una funzione Swift che fa il lavoro:

func roundToPlaces(value:Double, places:Int) -> Double {
    let divisor = pow(10.0, Double(places))
    return round(value * divisor) / divisor
}

20

In Swift 3.0 e Xcode 8.0:

extension Double {
    func roundTo(places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}

Usa questa estensione in questo modo:

let doubleValue = 3.567
let roundedValue = doubleValue.roundTo(places: 2)
print(roundedValue) // prints 3.56

19

Swift 4, Xcode 10

yourLabel.text =  String(format:"%.2f", yourDecimalValue)

1
Non ho votato in negativo, ma penso che il motivo potrebbe essere perché questo sta restituendo una rappresentazione in forma di stringa di un numero, non il numero. Il che va bene se è tutto ciò di cui hai bisogno, ma potresti voler arrotondare il numero stesso per un ulteriore uso. L'OP ha detto "quando stampo", quindi penso che questa sia una soluzione accettabile, facile e pulita in questo caso.
Ben Stahl,

1
Perfetto. Una soluzione di linea. Avevo solo bisogno di mostrare i valori decimali come stringhe nelle mie etichette.
Zeeshan,

18

Il codice per cifre specifiche dopo i decimali è:

var a = 1.543240952039
var roundedString = String(format: "%.3f", a)

Qui% .3f indica allo swift di arrotondare questo numero a 3 cifre decimali e se si desidera un numero doppio, è possibile utilizzare questo codice:

// String to Double

var roundedString = Double(String(format: "%.3f", b))


14

Usa la libreria Foundation Darwin integrata

SWIFT 3

extension Double {
    func round(to places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return Darwin.round(self * divisor) / divisor
    }
}

Uso:

let number:Double = 12.987654321
print(number.round(to: 3)) 

Uscite: 12.988


9

Un modo pratico può essere l'uso dell'estensione di tipo Double

extension Double {
    var roundTo2f: Double {return Double(round(100 *self)/100)  }
    var roundTo3f: Double {return Double(round(1000*self)/1000) }
}

Uso:

let regularPie:  Double = 3.14159
var smallerPie:  Double = regularPie.roundTo3f  // results 3.142
var smallestPie: Double = regularPie.roundTo2f  // results 3.14

9

Se si desidera arrotondare i Doublevalori, è possibile utilizzare Swift in Decimalmodo da non introdurre errori che possono sorgere quando si tenta di eseguire la matematica con questi valori arrotondati. Se lo si utilizza Decimal, può rappresentare accuratamente i valori decimali di quel valore in virgola mobile arrotondato.

Quindi puoi fare:

extension Double {
    /// Convert `Double` to `Decimal`, rounding it to `scale` decimal places.
    ///
    /// - Parameters:
    ///   - scale: How many decimal places to round to. Defaults to `0`.
    ///   - mode:  The preferred rounding mode. Defaults to `.plain`.
    /// - Returns: The rounded `Decimal` value.

    func roundedDecimal(to scale: Int = 0, mode: NSDecimalNumber.RoundingMode = .plain) -> Decimal {
        var decimalValue = Decimal(self)
        var result = Decimal()
        NSDecimalRound(&result, &decimalValue, scale, mode)
        return result
    }
}

Quindi, puoi ottenere il Decimalvalore arrotondato in questo modo:

let foo = 427.3000000002
let value = foo.roundedDecimal(to: 2) // results in 427.30

E se si desidera visualizzarlo con un numero specificato di posizioni decimali (oltre a localizzare la stringa per la locale corrente dell'utente), è possibile utilizzare un NumberFormatter:

let formatter = NumberFormatter()
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2

if let string = formatter.string(for: value) {
    print(string)
}

2
La migliore risposta finora.
Codetard,

(4.81).roundedDecimal(to: 2, mode: .down)restituirà 4.8 invece di 4.81, usare Decimal(string: self.description)!per un precisodecimalValue
vk.edward.li

1
@ vk.edward.li - Sì, bisogna stare attenti all'arrotondamento dei decimali su / giù, perché i valori come 4.81 semplicemente non possono essere rappresentati con precisione con Double(diventa 4.8099999999999996). Ma sconsiglio di utilizzare description(poiché l'arrotondamento che utilizza non è documentato ed è soggetto a modifiche). Se si vuole veramente fare la matematica decimale con precisione, si dovrebbe evitare Doubledel tutto e dovrebbe invece usare Decimaldirettamente (ad esempio, Decimal(sign: .plus, exponent: -2, significand: 481)o Decimal(string: "4.81")ma non usare. description.
Rob

@Rob di solito è impossibile ottenere il valore di stringa di "4,81" se è memorizzato come Double, quindi è necessario utilizzare self.description (un algoritmo Grisu2 modificato) per correggere la precisione che è già persa
vk.edward.li

Capisco il tuo punto. Non sono d'accordo con la tua soluzione. Il comportamento di arrotondamento del descriptionmetodo non è né documentato né garantito. Inoltre, non è localizzato. IMHO, è un errore usare descriptionper scopi diversi dalla registrazione. O userei Decimaltutto, evitando di usarlo Doubleinteramente, o semplicemente usando una diversa modalità di arrotondamento. Oppure, se è necessario, utilizzare il proprio metodo localizzato che utilizza l'algoritmo in stile Grisu (ma che sembra superfluo quando si conosce il numero di cifre decimali che si desidera arrotondare). Ma eviterei di fare affidamento su questo comportamento accessorio di description.
Rob,

8

Questa è una sorta di soluzione alternativa, che può tornare utile se le tue esigenze sono un po 'più complesse. Puoi usare un formattatore di numeri in Swift.

let numberFormatter: NSNumberFormatter = {
    let nf = NSNumberFormatter()
    nf.numberStyle = .DecimalStyle
    nf.minimumFractionDigits = 0
    nf.maximumFractionDigits = 1
    return nf
}()

Supponiamo che la variabile che si desidera stampare sia

var printVar = 3.567

Ciò assicurerà che venga restituito nel formato desiderato:

numberFormatter.StringFromNumber(printVar)

Il risultato qui sarà quindi "3,6" (arrotondato). Sebbene questa non sia la soluzione più economica, la dò perché l'OP menzionava la stampa (nel qual caso una stringa non è indesiderabile) e perché questa classe consente di impostare più parametri.


1
Una breve nota che qualsiasi formattatore è piuttosto costoso a livello di programmazione, rendendolo sconsiderato per le attività che devono essere eseguite rapidamente o ripetutamente.
Jonathan Thornton,

7

io userei

print(String(format: "%.3f", totalWorkTimeInHours))

e cambia .3f in qualsiasi numero di numeri decimali di cui hai bisogno


Voleva stampare con 3 cifre, non per ottenerlo in NSTimeInterval
Mohsen Hossein per l'

7

O:

  1. Utilizzando String(format:):

    • Typecast Doubleto Stringcon identificatore di %.3fformato e poi di nuovo aDouble

      Double(String(format: "%.3f", 10.123546789))!
    • Oppure estendi Doubleper gestire i punti N-decimali:

      extension Double {
          func rounded(toDecimalPlaces n: Int) -> Double {
              return Double(String(format: "%.\(n)f", self))!
          }
      }
  2. Per calcolo

    • moltiplicare per 10 ^ 3, arrotondarlo e poi dividere per 10 ^ 3 ...

      (1000 * 10.123546789).rounded()/1000
    • Oppure estendi Doubleper gestire i punti N-decimali:

      extension Double {    
          func rounded(toDecimalPlaces n: Int) -> Double {
              let multiplier = pow(10, Double(n))
              return (multiplier * self).rounded()/multiplier
          }
      }

6

Questo è un algoritmo più flessibile di arrotondamento a N cifre significative

Soluzione Swift 3

extension Double {
// Rounds the double to 'places' significant digits
  func roundTo(places:Int) -> Double {
    guard self != 0.0 else {
        return 0
    }
    let divisor = pow(10.0, Double(places) - ceil(log10(fabs(self))))
    return (self * divisor).rounded() / divisor
  }
}


// Double(0.123456789).roundTo(places: 2) = 0.12
// Double(1.23456789).roundTo(places: 2) = 1.2
// Double(1234.56789).roundTo(places: 2) = 1200

6

Il modo migliore per formattare una doppia proprietà è utilizzare i metodi predefiniti di Apple.

mutating func round(_ rule: FloatingPointRoundingRule)

FloatingPointRoundingRule è un enum che ha le seguenti possibilità

Casi di enumerazione:

case awayFromZero Arrotonda al valore consentito più vicino la cui grandezza è maggiore o uguale a quella della sorgente.

case down Arrotonda al valore consentito più vicino che è minore o uguale alla fonte.

case toNearestOrAwayFromZero Arrotonda al valore consentito più vicino; se due valori sono ugualmente vicini, viene scelto quello con maggiore magnitudine.

case toNearestOrEven Round al valore consentito più vicino; se due valori sono ugualmente vicini, viene scelto quello pari.

case verso Zero Arrotondare al valore consentito più vicino la cui grandezza è inferiore o uguale a quella della sorgente.

case up Arrotonda al valore consentito più vicino che è maggiore o uguale alla sorgente.

var aNumber : Double = 5.2
aNumber.rounded(.up) // 6.0

6

arrotondare un doppio valore a x numero di
NO decimale . di cifre dopo i decimali

var x = 1.5657676754
var y = (x*10000).rounded()/10000
print(y)  // 1.5658 

var x = 1.5657676754 
var y = (x*100).rounded()/100
print(y)  // 1.57 

var x = 1.5657676754
var y = (x*10).rounded()/10
print(y)  // 1.6

Cosa sta succedendo su questo codice? Cosa dimostrano i tre esempi?
rene,

Le risposte solo al codice non sono utili, prova a spiegare cosa fa ciascuno di questi esempi.
Moe,

5

Non Swift ma sono sicuro che avrai l'idea.

pow10np = pow(10,num_places);
val = round(val*pow10np) / pow10np;

4

Questo sembra funzionare in Swift 5.

Abbastanza sorpreso che non ci sia già una funzione standard per questo.

// Troncamento delle posizioni dal doppio al n decimale con arrotondamento

extension Double {

    func truncate(to places: Int) -> Double {
    return Double(Int((pow(10, Double(places)) * self).rounded())) / pow(10, Double(places))
    }

}

2

È possibile aggiungere questa estensione:

extension Double {
    var clean: String {
        return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(format: "%.2f", self)
    }
}

e chiamalo così:

let ex: Double = 10.123546789
print(ex.clean) // 10.12

Questo è un'implementazione ordinata di rappresentarlo come una stringa. Mi chiedo se sia possibile o razionale scrivere un'estensione del numero di cifre dopo il periodo mantenendola ancora doppia.
thinkswift

2

Per evitare le imperfezioni Float, usare Decimale

extension Float {
    func rounded(rule: NSDecimalNumber.RoundingMode, scale: Int) -> Float {
        var result: Decimal = 0
        var decimalSelf = NSNumber(value: self).decimalValue
        NSDecimalRound(&result, &decimalSelf, scale, rule)
        return (result as NSNumber).floatValue
    }
}

ex.
1075,58 arrotondamenti a 1075,57 quando si utilizza Float con scala: 2 e. Giù
1075,58 arrotondamenti a 1075,58 quando si utilizza Decimale con scala: 2 e. Giù


1

Ho trovato questo chiedendosi se è possibile correggere l'input di un utente. Cioè se inseriscono tre decimali anziché due per un importo in dollari. Di '1.111 invece di 1.11, puoi aggiustarlo arrotondando? La risposta per molte ragioni è no! Con denaro superiore a 0,001, alla fine si potrebbero causare problemi in un vero libretto degli assegni.

Ecco una funzione per controllare l'input degli utenti per troppi valori dopo il periodo. Ma ciò consentirà 1., 1.1 e 1.11.

Si presume che il valore sia già stato verificato per la corretta conversione da una stringa a una doppia.

//func need to be where transactionAmount.text is in scope

func checkDoublesForOnlyTwoDecimalsOrLess()->Bool{


    var theTransactionCharacterMinusThree: Character = "A"
    var theTransactionCharacterMinusTwo: Character = "A"
    var theTransactionCharacterMinusOne: Character = "A"

    var result = false

    var periodCharacter:Character = "."


    var myCopyString = transactionAmount.text!

    if myCopyString.containsString(".") {

         if( myCopyString.characters.count >= 3){
                        theTransactionCharacterMinusThree = myCopyString[myCopyString.endIndex.advancedBy(-3)]
         }

        if( myCopyString.characters.count >= 2){
            theTransactionCharacterMinusTwo = myCopyString[myCopyString.endIndex.advancedBy(-2)]
        }

        if( myCopyString.characters.count > 1){
            theTransactionCharacterMinusOne = myCopyString[myCopyString.endIndex.advancedBy(-1)]
        }


          if  theTransactionCharacterMinusThree  == periodCharacter {

                            result = true
          }


        if theTransactionCharacterMinusTwo == periodCharacter {

            result = true
        }



        if theTransactionCharacterMinusOne == periodCharacter {

            result = true
        }

    }else {

        //if there is no period and it is a valid double it is good          
        result = true

    }

    return result


}

1
//find the distance between two points
let coordinateSource = CLLocation(latitude: 30.7717625, longitude:76.5741449 )
let coordinateDestination = CLLocation(latitude: 29.9810859, longitude: 76.5663599)
let distanceInMeters = coordinateSource.distance(from: coordinateDestination)
let valueInKms = distanceInMeters/1000
let preciseValueUptoThreeDigit = Double(round(1000*valueInKms)/1000)
self.lblTotalDistance.text = "Distance is : \(preciseValueUptoThreeDigit) kms"

1
extension String{
  var roundedValue:String {
     return String(format: "%.3f", self)
}}

Utilizzo:

totalWorkTimeInHours.roundedValue

1

Eccone uno per SwiftUI se hai bisogno di un elemento Text con il valore numerico.

struct RoundedDigitText : View {
    let digits : Int
    let number : Double

    var body : some View {
        Text(String(format: "%.\(digits)f", number))
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.