Le moyen le plus rapide pour convertir une base de 10 numéros à toute la base dans .NET?
J'ai et les anciens(ish) méthode C# que j'ai écrit qui prend un nombre et le convertit à toute la base:
string ConvertToBase(int number, char[] baseChars);
Il n'est pas super rapide et soigné. Est-il un bon moyen connu de la réalisation de ce dans .NET?
Je suis à la recherche de quelque chose qui me permet d'utiliser tous de base avec une chaîne quelconque de caractères à utiliser.
Cela ne vous permet de bases 16, 10, 8 et 2:
Convert.ToString(1, x);
Je veux utiliser cette fonction pour obtenir un massivement de base haute en prenant avantage des chiffres, des minuscules et des majuscules des lettres. Comme dans ce fil, mais pour C# pas de JavaScript.
Quelqu'un sait-il d'un moyen efficace de le faire en C#?
Vous devez vous connecter pour publier un commentaire.
Convertir.ToString
peut être utilisé pour convertir un nombre équivalent de la chaîne de la représentation dans une base spécifiée.Exemple:
Cependant, comme souligné par les commentaires,
Convert.ToString
prend uniquement en charge les éléments suivants limitée mais généralement suffisante - ensemble de bases: 2, 8, 10 ou 16.Mise à jour (pour répondre à l'exigence de convertir à toute la base):
Je ne suis pas au courant de n'importe quelle méthode de la BCL qui est capable de convertir des nombres à toute la base de sorte que vous devez écrire votre propre fonction d'utilité. Un exemple simple serait ressembler à ça (notez que cela ne peut certainement être fait plus rapidement en remplacement de la concaténation de chaîne):
Mise À Jour 2 (Amélioration Du Rendement)
À l'aide d'une matrice de mémoire tampon au lieu de concaténation de chaîne à construire la chaîne de résultat donne une amélioration de la performance en particulier sur le grand nombre (voir la méthode
IntToStringFast
). Dans le meilleur des cas (c'est à dire la plus longue possible d'entrée) cette méthode est à peu près trois fois plus vite. Toutefois, pour les 1-chiffres (c'est à dire 1-chiffre dans la base cible),IntToString
sera plus rapide.12345 / 60
une valeur de205
. Le résultat correct de 205.75 est tronqué, car c'est une division de valeurs entières.z
au lieu dex
. (Enstring xx = ...
) Juste au cas où que quelqu'un le copier/coller(ce qui est mauvais, comme nous le savons 🙂 )j'ai récemment blogué sur ce. Mon application ne pas utiliser toutes les opérations de la chaîne pendant les calculs, ce qui le rend très rapide. De Conversion à un système de numération à base de 2 à 36 est pris en charge:
J'ai également mis en œuvre rapide de la fonction inverse dans le cas où quelqu'un a besoin de trop:
Arbitraire de Système de Numération Décimal.
result = "-" + result
? Est une sorte de rembourrage? Comment pourrais-je modifier le code afin que je utilisez uniquement Un-Z ou 0-9 pour un rembourrage personnage?"-"
dansresult = "-" + result
représente le signe négatif de nombres négatifs. Ce n'est pas un rembourrage personnage.On peut également utiliser une version légèrement modifiée de la accepté un seul et ajuster la base de caractères de la chaîne à ses besoins:
RAPIDE "DE" ET "À" MÉTHODES
Je suis en retard à la fête, mais j'ai composé les réponses précédentes et amélioré au-dessus d'eux. Je pense que ces deux méthodes sont plus rapides que les autres posté jusqu'à présent. J'ai été en mesure de convertir des 1 000 000 de numéros à partir de et vers la base de 36 en vertu de 400ms dans une seule base de la machine.
Exemple ci-dessous est pour de la base de 62. Modifier la
BaseChars
tableau pour convertir de et vers toutes les autres de la base.MODIFIER (2018-07-12)
Fixé à l'adresse du coin de cas trouvés par @AdrianBotor (voir les commentaires) conversion 46655 à base 36. Ceci est causé par une petite virgule flottante erreur de calcul
Math.Log(46656, 36)
qui est exactement 3, mais .Rendements NETS3 + 4.44e-16
, ce qui provoque un supplément de caractère dans le tampon de sortie.BaseToLong(LongToBase(46655)) == 46655
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
et de convertir la valeur46655
. Résultat devrait êtreZZZ
mais dans le débogueur-je obtenir\0ZZZ
. Seulement cela obtenir une valeur supplémentaire\0
. Par exemple la valeur46654
convertit correctement àZZY
.LongToBase
àreturn new string(buffer, (int) i, buffer.Length - (int)i);
Très en retard à la fête sur ce point, mais j'ai écrit une classe helper récemment pour un projet au travail. Il a été conçu pour convertir des chaînes courtes en chiffres et en arrière de nouveau (simpliste parfait de hachage fonction), mais il permettra également d'effectuer le numéro de conversion entre des bases arbitraires. Le
Base10ToString
méthode de la mise en œuvre répond à la question qui a été posté.La
shouldSupportRoundTripping
drapeau passé au constructeur de la classe est nécessaire pour prévenir la perte des premiers chiffres du numéro de chaîne au cours de la conversion en base 10 et de retour à nouveau (crucial, compte tenu de mes besoins!). La plupart du temps la perte de leader de 0s à partir du numéro de chaîne ne sera probablement pas un problème.De toute façon, voici le code:
Cela peut aussi être sous-classé pour tirer personnalisé nombre de convertisseurs:
Et le code pourra être utilisé comme ceci:
Pourrait cette classe de ce post sur le forum vous aider?
Totalement non testé... laissez-moi savoir si cela fonctionne! (Copier-collé dans le cas où le post sur le forum s'en va, ou quelque chose...)
Je recherchais un moyen rapide de convertir le nombre décimal à une autre base dans la gamme de [2..36] j'ai donc développé le code suivant. Son simple à suivre et utilise un objet Stringbuilder comme un proxy pour un tampon de caractères que nous pouvons indice de caractère par caractère. Le code semble être très rapide par rapport aux alternatives et beaucoup plus vite que l'initialisation des caractères individuels dans un tableau de caractères.
Pour votre propre usage, vous préférerez peut-être:
1/Retourne une chaîne vide plutôt que de jeter une exception.
2/retirez le radix vérifiez la méthode de courir encore plus vite
3/Initialiser l'objet Stringbuilder avec 32 '0' et de supprimer la ligne de résultat.Supprimer( 0, i );. Ce sera la cause de la chaîne de caractères à renvoyer avec les zéros non significatifs et d'augmenter la vitesse.
4/Faire l'objet Stringbuilder un champ statique au sein de la classe, alors peu importe combien de fois la DecimalToBase méthode est appelée, l'objet Stringbuilder est seulement initialisées à la fois. Si vous faites ce changement 3 ci-dessus ne fonctionnerait plus.
J'espère que quelqu'un trouve cela utile 🙂
AtomicParadox
J'ai été en utilisant ce pour stocker un Guid comme une chaîne plus courte (mais il a été limité à l'utilisation de 106 caractères).
Si quelqu'un est intéressé voici mon code pour le décodage de la chaîne de valeur numérique (dans ce cas, j'ai utilisé 2 ulongs pour le Guid de la valeur, plutôt que de coder un Int128 (depuis que je suis en 3.5 4.0 pas).
Pour la clarté du CODE est une chaîne const avec 106 unique caractères. ConvertLongsToBytes est assez limité.
J'avais un besoin similaire, sauf que j'ai besoin de faire des maths sur les "chiffres" ainsi. J'ai pris quelques suggestions ici et a créé une classe qui peut faire toutes ces choses amusantes. Il permet à n'importe quel caractère unicode à être utilisés pour représenter un nombre et il travaille avec des décimales trop.
Cette classe est assez facile à utiliser. Il suffit de créer un certain nombre, comme un type de
New BaseNumber
, définir quelques propriétés, et votre. Les routines de prendre soin de commutation entre la base 10 et base x automatiquement et la valeur que vous avez définie est conservé dans la base de vous dans, donc pas de précision est perdu (jusqu'à la conversion qui est, mais même alors, la perte de précision due doit être très minime, car cette routine utiliseDouble
etLong
dans la mesure du possible).Je ne peux pas commande sur la vitesse de cette routine. Il est probablement très lent, donc je ne sais pas si il va répondre aux besoins de celui qui a posé la question, mais il certain, c'est flexible, donc j'espère que quelqu'un d'autre peut utiliser ce fichier.
Pour quelqu'un d'autre qui pourrait avoir besoin de ce code pour le calcul de la prochaine colonne dans Excel, je vais inclure la boucle de code que j'ai utilisé, qui tire parti de cette classe.
Et maintenant, pour le code de la boucle à travers des colonnes Excel:
Vous remarquerez que la partie importante de la partie Excel est que 0 est identifié par un @ dans le re-basé nombre. Je viens donc de filtrer tous les nombres qui ont un @ et je reçois la séquence correcte (A, B, C, ..., Z, AA, AB, AC, ...).