alfanumerico

Supponiamo che io mostri i dati a un utente in una griglia, un rapporto, una casella a discesa, ecc. I dati in questione contengono un campo denominato Numero fattura . Questo campo contiene solo valori numerici 2/3 del tempo, ma laltro 1/3 del tempo è un misto di caratteri alfa-numerici.

Per questo motivo, qualsiasi algoritmo di ordinamento ordinerebbe alfabeticamente anziché numericamente . Per questo motivo, 1000 verrebbe molto prima di 99. Perché la prima cifra è ordinata su, non lintero valore. Altri elementi come 000333 non verrebbero trattati come “333” e verrebbero visualizzati prima del 222.

Esiste uno standard qui? Dovrei provare a convertire tutti i valori in un valore numerico e ordinarli in modo diverso? Come si sarebbero integrati di nuovo insieme? O lordinamento alfanumerico è il modo corretto di procedere?

Commenti

  • Se puoi dire, usa la sottostringa per troncare i primi tre cifre che hanno gli alfabeti e che ordinano esclusivamente in base alle ultime tre cifre, nel tuo caso diciamo ABC333 e 000222 – potresti implementarlo. Certo, durante la visualizzazione verrebbe nellordine 000222 e poi ABC333. Tuttavia, visivamente sarebbe un po di confusione vedere zeri contro pochi numeri e alfabeti contro altri. Cosa suggeriscono gli alfabeti?
  • Lunghezze variabili, quindi nessuna sottostringa. Penso di vedere ” 10 ” venire prima di ” 9 ” (in realtà molto prima del 9) creerebbe confusione per gli utenti che non ‘ usano spesso i numeri alfa. Daltra parte, una pura combinazione di questi può davvero ‘ essere ordinata in qualsiasi modo carino che io possa vedere.
  • Se queste sono fatture, puoi ordinarle per data o è necessario ordinarlo esplicitamente in base al numero della fattura stessa? Forse potresti usare unaltra colonna dalla tabella e ordinarle di conseguenza. Supponendo che queste siano generate in ordine crescente, avrebbe senso un ordine cronologico delle fatture con quella più frequente generata in alto, no? Non sono sicuro a cosa serva effettivamente il menu a discesa o in che modo lutente possa trarne vantaggio. Se potessi chiarirci di più sulluso del campo, sarebbe molto più utile!
  • Spetta ‘ allutente. Possono visualizzare questi dati tramite report, tramite una schermata di contabilità che consente loro di controllare i saldi rispetto a Net 30 (vedere tutte le fatture di un fornitore), ecc. Lutente sceglie come desidera che la schermata o il report siano ordinati. La data è unopzione. Ma lo è anche il numero di fattura. Questi non sono generati dalla mia applicazione. Ordini forniture, parti, ecc. Dai fornitori. Quel fornitore specifico ti restituisce un numero di fattura. Come se avessi ordinato da cinque negozi online e avessi ricevuto cinque numeri dordine. Alcuni sono numerici altri no.
  • Dovresti convertire questi numeri in un formato numerico. Utilizzare questo solo per ordinare i valori alfanumerici. I numeri convertiti non devono essere mostrati allutente per creare maggiore confusione. Tuttavia, ti consiglio vivamente di avere unaltra colonna, ad esempio, Data per completare gli alfanumerici. Poiché lordinamento degli alfanumerici creerà un po di confusione, unaltra colonna per aiutare lutente a capire la data pertinente o qualcosaltro sarebbe di grande aiuto.

Risposta

A partire da Windows 7, Microsoft ha cambiato il metodo predefinito di ordinamento delle directory in base al nome del file per utilizzare lordinamento “numerico”. (Alcune informazioni qui )

Anche se non sono riuscito a trovare una specifica del suo comportamento, sono riuscito a decodificarlo. Questo algoritmo dovrebbe confronta due stringhe alfanumeriche e determina quale viene prima.

  • Dividi ogni nome di file in parti alfabetiche e numeriche; cioè il nome text123moretext456 diventa il elenco {"text", "123", "moretext", "456"}

  • Per ciascuna parte nei due nomi di suddivisione, eseguire il seguente confronto:

    • Se entrambe le parti sono strettamente numeriche, confrontare loro come numeri
      • Se i numeri sono gli stessi, confrontali come stringhe
      • Se le stringhe sono le stesse, passa alla parte successiva
    • Se entrambe le parti sono rigorosamente lettere, confrontale come stringhe
      • Se sono uguali, passa alla parte successiva
  • Se finisci le parti, il nome con il minor numero di parti viene f irst

Ti ritroverai con un ordine come il seguente:

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

Commenti

  • Questo è esattamente quello che stavo cercando e lordinamento risultante ha senso. Grazie!

Risposta

Questa domanda (e specialmente la risposta di @Harrison Paine) mi ha aiutato il mio progetto e io vogliamo fornire limplementazione [javascript] della sua risposta per riferimento futuro.Ecco lordinamento 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; }; 

Ed ecco come usarlo:

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); 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *