Supposons que jaffiche des données à un utilisateur dans une grille, un rapport, une liste déroulante, etc. Les données en question contiennent un champ appelé Numéro de facture . Ce champ ne contient que des chiffres 2/3 du temps, mais lautre 1/3 du temps est un mélange dalpha-numériques.

Pour cette raison, tout algorithme de tri trierait par ordre alphabétique au lieu de numérique . Pour cette raison, 1000 viendrait bien avant 99. Parce que le premier chiffre est trié sur – pas la valeur entière. Dautres éléments comme 000333 ne seraient pas traités comme « 333 » et apparaîtront avant 222.

Y a-t-il une norme ici? Dois-je essayer de convertir toutes les valeurs en une valeur numérique et de les trier différemment? Comment seraient-ils réintégrés ensemble? Ou le tri alphanumérique est-il la bonne façon de procéder?

Commentaires

  • Si vous avez la possibilité de dire, utilisez une sous-chaîne pour tronquer les trois premiers les chiffres qui ont les alphabets et sont triés uniquement en fonction des trois derniers chiffres, dans votre cas, dites ABC333 et 000222 – vous pouvez limplémenter. Bien sûr, tout en laffichant, il viendrait dans lordre 000222 puis ABC333. Cependant, visuellement, il serait un peu déroutant de voir des zéros contre quelques chiffres et des alphabets contre dautres. Que suggèrent les alphabets?
  • Différentes longueurs donc pas de sous-chaîne. Je pense que voir  » 10  » venir avant  » 9  » (en fait FAR avant 9) serait déroutant pour les utilisateurs qui ‘ nutilisent souvent pas de caractères alphanumériques. Dun autre côté, un mélange pur de ces éléments ne peut vraiment ‘ t être trié de la manière que je peux voir.
  • Sil sagit de factures, pouvez-vous les trier par date ou doit-il être explicitement trié en fonction du numéro de facture lui-même? Vous pourriez peut-être utiliser une autre colonne du tableau et les trier en conséquence. En supposant que celles-ci soient générées dans un ordre croissant, un ordre chronologique des factures avec la plus fréquente générée en haut aurait du sens, non? Je ne sais pas à quoi sert réellement la liste déroulante ou comment lutilisateur peut-il en bénéficier. Si vous pouviez nous éclairer davantage sur lutilisation du champ, ce serait beaucoup plus utile!
  • Il ‘ dépend de lutilisateur. Ils peuvent visualiser ces données via le reporting, via un écran de comptabilité qui leur permet de vérifier les soldes par rapport au Net 30 (voir toutes les factures dun fournisseur), etc. Lutilisateur choisit comment il souhaite que lécran ou le rapport soit trié. La date est une option. Mais le numéro de facture lest aussi. Ceux-ci ne sont pas générés par mon application. Vous commandez des fournitures, des pièces, etc. auprès de fournisseurs. Ce fournisseur spécifique vous renvoie un numéro de facture. Comme si vous avez commandé dans cinq boutiques en ligne et obtenu cinq numéros de commande. Certains sont numériques, dautres non.
  • Vous devez convertir ces nombres en un format numérique. Utilisez ceci uniquement pour trier les valeurs alphanumériques. Les nombres convertis nont pas besoin dêtre montrés à lutilisateur pour causer plus de confusion. Je vous recommande cependant fortement davoir une autre colonne par exemple – Date pour compléter les alphanumériques. Comme le tri des alphanumériques sera un peu déroutant, une autre colonne pour aider lutilisateur à déterminer la date pertinente ou autre chose aiderait beaucoup.

Réponse

À partir de Windows 7, Microsoft a changé sa méthode par défaut de tri des répertoires par nom de fichier pour utiliser le tri « numérique ». (Quelques informations ici )

Bien que je ne puisse pas trouver une spécification de son comportement, jai réussi à le faire de lingénierie inverse. Cet algorithme devrait comparez deux chaînes alphanumériques et déterminez celle qui vient en premier.

  • Divisez chaque nom de fichier en parties alphabétiques et numériques; cest-à-dire que le nom text123moretext456 devient le liste {"text", "123", "moretext", "456"}

  • Pour chaque partie des deux noms de division, effectuez la comparaison suivante:

    • Si les deux parties sont strictement numériques, comparez les sous forme de nombres
      • Si les nombres sont identiques, comparez-les sous forme de chaînes
      • Si les chaînes sont identiques, passez à la partie suivante
    • Si les deux parties sont strictement des lettres, comparez-les en tant que chaînes
      • Si elles « sont identiques, passez à la partie suivante
  • Si vous manquez de pièces, le nom avec le moins de pièces vient f Premièrement

Vous vous retrouvez avec une commande comme celle-ci:

2 12 200000 1000000 a a12 b2 text2 text2a text2a2 text2a12 text2b text12 text12a 

Commentaires

  • Cest exactement ce que je recherchais, et lordre de tri qui en résulte est logique. Merci!

Réponse

Cette question (et spécialement la réponse de @Harrison Paine) mavait aidé sur mon projet et je veux fournir limplémentation [javascript] de sa réponse pour référence future.Voici le tri function:

var win7sort = function(a, b) { var regex = /[^\d]+|\d+/g; // Split each filename into alphabetical and numeric parts var ar = a.match(regex); var br = b.match(regex); var localeCompare; // For each part in the two split names, perform the following comparison: for(var ia in ar) { for(var ib in br) { var ari = ar[ib]; if(ari == undefined) { ari = ""; } var bri = br[ib]; if(bri == undefined) { bri = ""; } // If both parts are strictly numeric, compare them as numbers if(!isNaN(ari) && !isNaN(bri)) { localeCompare = ari.localeCompare(bri, {}, { numeric: true }); } else { localeCompare = ari.localeCompare(bri, {}, { ignorePunctuation: true, sensitivity: "base" }); } if(localeCompare != 0) { // If you run out of parts, the name with the fewest parts comes first return localeCompare; } // If they"re the same, move on to the next part } } return localeCompare; }; 

Et voici comment lutiliser:

var list = ["1", "a", "z", "new folder 2", "new folder 03", "new folder 03-a", "new folder 039", "new folder 5", "new folder 41", "2", "21", "3", "41", "100"]; var sortedList = list.sort(win7sort); 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *