2014-06-24 1 views
1

J'essaie d'enregistrer et de récupérer MPMediaPlaylists en utilisant leurs persistentId s, qui sont NSNumbers. En raison de ma configuration de classe, j'ai besoin de sauvegarder ces identifiants sous forme de chaînes. Cependant, lorsque j'essaie de reconvertir les chaînes en NSNumbers, elles apparaissent en notation scientifique plutôt qu'en notation décimale. Voici mon code:NSNumberFormatter renvoyant la notation scientifique lorsqu'il est mis au style décimal

let numberFormatter = NSNumberFormatter() 
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle 
let number = numberFormatter.numberFromString(playlists[indexPath.row].id) 
println(playlists[indexPath.row].id) 
println(number) 

Le .id est une propriété de mon objet Playlist, qui est une chaîne. Pour une liste de lecture, les sorties sont les suivantes:

13818827612659406491 
1.381882761265941e+19 

Qu'est-ce qui me manque?

Répondre

1

De la documentation:

Double a une précision d'au moins 15 chiffres décimaux, alors que la précision du flotteur peut être aussi peu que 6 chiffres décimaux. Le type de virgule flottante approprié à utiliser dépend de la nature et de la plage de valeurs que vous devez utiliser dans votre code.

Votre numéro comporte plus de 15 chiffres de précision.

let str = "13818827612659406491" // 20 digits 
let numberFormatter = NSNumberFormatter() 
numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle 
let number = numberFormatter.numberFromString(str) //13,818,827,612,659,400,000.0 - 15 significant digits 

également à partir de la documentation:

NSDecimalNumber, une sous-classe immuable de NSNumber, fournit une enveloppe orientée objet pour faire de l'arithmétique en base 10. Un exemple peut représenter un nombre quelconque qui peut être exprimée sous la forme mantisse x 10^exposant où mantisse est un entier décimal pouvant aller jusqu'à 38 chiffres long, et l'exposant est un entier de -128 à 127.

ce qui explique pourquoi la La propre réponse d'OP fonctionne.

+1

Je dois récupérer un élément 'MPMediaPlaylist' en utilisant un' MPMediaQuery' avec l'id.Aussi dans la documentation d'Apple concernant la propriété 'MPMediaPlaylistPropertyPersistentID':" L'identifiant persistant pour la liste de lecture Value est un objet NSNumber contenant un UInt64_t (unsigned long long). " – Garrett

+0

Étrange! essayez ce qui suit dans le terrain de jeu ... laissez ui: UInt64 = 13818827612659406491 // pas ce que vous attendez! – Grimxn

+0

Cela * est * très étrange ... Comment un UInt peut-il avoir un signe négatif? – Garrett

1

faits:

  1. Votre numéro est pas un nombre décimal
  2. NSNumberFormatter fera vos chaînes localisées (point décimal par exemple localisée).
  3. NSNumberFormatter considère tous les nombres comme des doubles afin que vous perdiez toujours la précision.

Réponse:

Ne pas utiliser NSNumberFormatter, il ne fonctionnera pas ici du tout. Pour obtenir la chaîne d'un nombre, utilisez simplement -[NSNumber stringValue]. Pour obtenir le numéro de la chaîne, utilisez directement -[NSString longLongValue] ou NSScanner. La meilleure solution, bien sûr, est de laisser l'ID NSNumber. La convertir en une chaîne et en arrière ne cause que des problèmes.

+0

Swift ne semble pas autoriser 'longLongValue' sur un' String' – Garrett

+0

@Garrett Oui, c'est seulement sur un 'NSString'. 'String' et' NSString' ne sont pas toujours interchangeables. Puisque Swift n'a pas encore ses propres frameworks, vous devrez travailler avec des objets Obj-C, y compris NSStrings ... – Sulthan

-2

J'ai trouvé ma réponse:

let number = NSDecimalNumber(string: playlists[indexPath.row].id) 

Cela fonctionne très bien. Je ne sais pas pourquoi cela fonctionne quand NSNumberFormatter n'a pas ...

+2

"Je ne sais pas pourquoi cela fonctionne quand NSNumberFormatter n'a pas" Je suggérerais de lire les autres réponses et commentaires qui expliquent exactement pourquoi cela n'a pas fonctionné. – Fogmeister

+0

Je comprends pourquoi les autres n'ont pas fonctionné. Mais je ne sais pas comment celui-ci a fonctionné malgré cela. – Garrett

+2

@Garrett Parce que 'NSDecimalNumber' utilise l'arithmétique décadique (10-base) (pas binaire) donc il ne perd pas de précision. Il a aussi son propre analyseur donc il y a une chaîne de conversion directe -> nombre tandis que 'NSNumberFormatter' convertit toujours la chaîne en un' double 'en premier. De plus, vous ne lui demandez pas de le formater en nombre décimal ... – Sulthan

Questions connexes