Est-il un équivalent de JavaScript parseInt en C#?
Je me demandais si quelqu'un avait mis sur pied quelque chose ou avait vu quelque chose d'équivalent pour le JavaScript parseInt pour C#.
Plus précisément, je suis à la recherche de prendre une chaîne de caractères comme:
123abc4567890
et de ne renvoyer que le premier entier valide
123
J'ai une méthode statique que j'ai utilisé qui sera de retour que les numéros:
public static int ParseInteger( object oItem )
{
string sItem = oItem.ToString();
sItem = Regex.Replace( sItem, @"([^\d])*", "" );
int iItem = 0;
Int32.TryParse( sItem, out iItem );
return iItem;
}
Ci-dessus serait:
ParseInteger( "123abc4567890" );
et rends-moi
1234567890
Je ne suis pas sûr si c'est possible de le faire avec une expression régulière, ou si il y a une meilleure méthode pour prendre juste le premier entier de la chaîne.
Merci pour toutes les réponses, ils ont tous été très utile. J'ai marqué leppie est comme acceptée parce qu'elle était d'abord par un peu et a fait un travail. J'ai pris ses et a couru avec qui, avec quelques modifications. Jon Skeet est certainement le plus complet. Merci encore!
OriginalL'auteur Doozer Blake | 2009-06-10
Vous devez vous connecter pour publier un commentaire.
Vous sont proches.
Vous voulez probablement seulement:
Ahh, vous avez raison, un ^ au début de la RE qould probablement être assez bon 🙂 Merci
leppie: je n'étais pas suggérer que c'était nécessaire, tant que votre mise en œuvre du comportement peut bien être souhaitable, et je voulais vérifier 🙂
Vous ne pouvez pas utiliser var dans ce foreach car Regex.Les matchs retours un MatchCollection qui est un non générique ICollection. Il se trouve que je blogué sur ce hier: alicebobandmallory.com/articles/2009/06/09/...
OriginalL'auteur leppie
Voici un exemple complet. Il va lever une exception si vous ne lui donnez pas la validité d'une chaîne vous pouvez changer ce comportement par pas explicitement lancer une exception dans
ParseInteger
, et à l'aide deint.TryParse
à la place.Noter qu'il permet une signe en tant que bien, mais pas un leader +. (Encore une fois, facile à changer.)
Également noter que, bien que j'ai trois cas de test pour la réussite des situations, je n'ai pas de cas de test à l'échec.
Enfin, il ne correspond pas à "abc123def". Si vous le souhaitez, supprimer les ^ de la regex.
Vous auriez à l'indice de référence pour déterminer la performance. Je ne connais pas les détails de comment .NET regexes sont mis en œuvre. Il dépendra des options si - dans ce cas, je n'ai pas précisé qu'il doit être compilé, ce qui serait probablement aider à la performance après le premier succès de la compilation.
comme vous l'avez écrit un test-suite: pourriez-vous éventuellement effectuer ce test dans peu de temps libre pour moi?
Cette suite de test est encore en cours de développement, j'en ai peur. Avec les révisions pour le C# en Profondeur pour la deuxième édition, je n'ai pas vraiment de temps libre pour le moment. Désolé 🙁
ah ... ok ... je vais avoir un coup d'oeil sur le mien, quand j'ai du temps!
OriginalL'auteur Jon Skeet
Une légère modification de Jon Skeet, l'excellente solution est dans l'ordre.
Je voudrais changer les regex (comme indiqué par Jon):
@"^([^\d]+)?(+|-)?\d+"
Cela permet le cas des personnages principaux de l'avant de la première occurrence d'un caractère
(par exemple,
asb12354
->12354
) et les deux entier signé de cas (par exemple+
ou-
)OriginalL'auteur Mark
OriginalL'auteur Lucero
Vous pouvez utiliser cette RegEx ("\A\d+") pour trouver les numéros au début d'une chaîne.
Vous pouvez ensuite utiliser int.Parse() pour convertir une chaîne en nombre entier.
OriginalL'auteur nikmd23
OriginalL'auteur Siim Nelis
Vous N'avez PAS à écrire votre propre int fonction d'analyse!!!!
Je sais que ce fil est assez vieux. mais il y a quelques façon simple de le faire:
Ou:
//utilisation de ceux qui dépendent de votre situation:
REMARQUE:
Je réponds à votre Question le Sujet "Est-il un équivalent de JavaScript parseInt en C#?", juste vous donner une idée, ne PAS écrire votre code pour vous. Vous devez d'abord faire un filtrage sur les "Caractères Alphabétiques", vous pouvez le faire avec l'Expression Régulière ou une simple chaîne de caractères.Remplacer ou à vous.
Je réponds à votre Question le Sujet "Est-il un équivalent de JavaScript parseInt en C#?", juste vous donner une idée, ne PAS écrire votre code pour vous. Vous devez d'abord faire un filtrage sur les "Caractères Alphabétiques", vous pouvez le faire avec l'Expression Régulière ou une simple chaîne de caractères.Remplacer ou à vous.
OriginalL'auteur Vin.X