iOS convertir un grand nombre de plus petit format
Comment puis-je convertir tous les nombres qui sont plus de 3 chiffres en bas à 4 chiffres ou moins?
C'est exactement ce que je veux dire:
10345 = 10.3k
10012 = 10k
123546 = 123.5k
4384324 = 4.3m
L'arrondi n'est pas entièrement importante, mais un ajout plus.
J'ai regardé dans NSNumberFormatter mais n'ont pas trouvé la bonne solution, et je n'ai pas encore trouver une solution appropriée ici sur DONC. Toute aide est grandement appréciée, merci!
- Il peut donner une idée des stackoverflow.com/questions/9345136/...
- qu'est-ce que K et M ?? (je veux dire qu'il est le symbole de l'unité) ??
- iPatel: Comme la SORTE de réputation de l'affichage des points
- Merci beaucoup! J'ai dû changer un peu les choses autour, mais le lien donné mon la base de code pour commencer. Je vais poster ci-dessous les 2 fonctions que j'ai créé pour obtenir l'effet désiré
Vous devez vous connecter pour publier un commentaire.
exemple d'utilisation
[Mise à jour]
Swift version ci-dessous:
exemple d'utilisation
Espère que cela aide
int sign = ( (n < 0) ? -1 : (n > 0) ? 1 : 0 );
puisnum = labs(num)
, et enfin mettre le-
signe avant le suffixe numéro de vérification de la valeur de signeJ'ai eu le même problème et a fini à l'aide de Kyle approche, mais malheureusement, il se brise lorsque les nombres comme 120000 sont utilisés, montrant 12k au lieu de 120K et j'avais besoin de montrer un petit nombre comme: 1.1 K à la place de l'arrondi vers le bas à 1K.
Donc voici mon montage de Kyle idée originale de:
J'Espère que cela peut vous aider les gars.
for (int i = (int)abbrev.count - 1; i >= 0; i--) {
Voici ma version ! Merci pour les réponses précédentes.
Les objectifs de cette version est :
NSNumberFormatter
pour éviter les problèmes de localisation (comme la virgule au lieu du point en français)NSNumberFormatterRoundingMode
Vous pouvez utiliser tous les merveilleux
NSNumberFormatter
options pour répondre à vos besoins, voir NSNumberFormatter De Référence De ClasseLe code (gist):
Résultat :
numFormatter.maximumFractionDigits = Int(value).description.characters.count > 2 ? 0 : 1
quand je l'ai croisé les seuils pour correspondre à la diviseurs dans tous les cas.Flávio J Vieira Caetano réponse converti à Swift 3.0
[-1000, -999999, 999999, 77777, 79578, 10088799]
retourne-1000, -999999, 1000.0K, 77.8K, 79.6K, 10.1M
.characters
il fixe.J'ai rencontré un problème similaire essayant de formater les valeurs de l'axe y dans Shinobi Graphiques. Il requis à l'aide d'un NSNumberFormatter, donc j'ai finalement venu avec cette
Pour obtenir une valeur mise en forme
Cette solution ne permet pas d'avoir l'arrondissement inclus, mais si vous (ou quelqu'un d'autre) juste besoin de quelque chose de simple, cela pourrait fonctionner. Si vous avez besoin par milliers, au lieu d'en millions de dollars, vous changez le "M" à un "K" dans le setPostiveFormat méthode, et de changer le NSNumber valeur du coefficient multiplicateur à 0,001 .
Voici deux méthodes que j'ai qui travaillent ensemble pour produire l'effet désiré. Ce sera aussi automatiquement round up. Cela permettra également de spécifier combien de nombres total sera visible par passage de l'int déc.
Aussi, dans le flotteur à la méthode de chaîne, vous pouvez modifier la
@"%.1f"
à@"%.2f"
,@"%.3f"
, etc pour lui dire combien visible de décimales à afficher après la virgule.Espère que cela aide quelqu'un d'autre qui en a besoin!
@"4K"
. Je pense qu'il a quelque chose à voir avec lafloatToString:
méthode mais n'arrive pas à le résoudre. La logique avant l'appel àfloatToString:
tournenumber
en 40.00000 mais le tout en boucle, couper à@"4"
.Après avoir essayé un couple de ces solutions, Luca laco semble avoir la plus proche, mais j'ai fait quelques modifications à sa méthode afin d'avoir plus de contrôle sur la façon dont beaucoup de chiffres apparaît (c'est à dire si vous voulez 120.3 K à être plus court, vous pouvez le limiter à 120K). En outre, j'ai ajouté une étape supplémentaire, ce qui assure un certain nombre comme 999,999 n'apparaît pas comme 1000.0 K, au lieu de 1,0 M.
onlyShowDecimalPlaceForNumbersUnder = 100
, parce que je veux comme70669 - Result: 70.7K
.Je sais qu'il y a déjà beaucoup de réponses et de différentes façons, mais c'est comment je l'ai résolu avec une approche plus fonctionnelle:
Swift version
Traduction directe de l'Objective-C version
Vous pouvez utiliser cette fonction simple, l'idée est facile à comprendre
Test
Swift-4
Doble extension
- Ce qui fonctionne bien dans tous les cas.Mise à jour de réponse pour la conversion rapide
Ici est une version mise à jour de Luca de Iaco réponse qui fonctionne avec Swift 4
Swift 4.0 version de Phan Van Linh la réponse de
Si vous êtes intéressé dans le formatage de nombre d'octets, cet article par Mattt Thompson montre comment utiliser iOS/OSX builtin NSByteCountFormatter
Il y a aussi des builtin formateurs pour l'énergie, masse, longueur et un tas d'autres.
Le cœur du problème est que la plupart des unités que vous n'avez pas besoin d'écrire du code personnalisé comme Apple l'a déjà fourni le travail fastidieux pour vous. Vérifiez en ligne de référence pour les NS[SomeUnit]module de Formatage, par exemple
MKDistanceFormatter
,NSDateIntervalFormatter
ouNSDateFormatter
, etc ...J'ai utilisé gbitaudeau la réponse à faire de cet Objectif de la catégorie C de NSNumberFormatter, qui-je l'utiliser dans notre projet (Vero.co). Le NSNumberFormatter exemple, ici créé qu'une seule fois pour l'ensemble du projet.
Maintenant, vous pouvez l'appeler comme ça
La méthode suivante gère à la fois les nombres positifs et négatifs contrairement à la plupart des solutions ici.
Il fonctionne même pour la monnaie.
De sortie est comme ci-dessous
J'ai créé la méthode ci-dessus basé sur @Kyle Begeman d'origine de l'inspiration à partir du lien partagé par @Pandiyan Cool.
Grâce à @Jeff B pour le premier code en Javascript à partir du lien suivant. Est-il un moyen pour arrondir des nombres à un lecteur de format convivial? (par exemple, $1.1 k)
Swift 2.2 Double extension:
Une swift 4 et swift 5 compatible solution
Pourquoi les gars, vous ne obtenir ce si difficile?
il peut être aussi simple que cela: