Suppression des caractères non numériques dans la chaîne

116

Hé, je cherche à supprimer les caractères non numériques dans une chaîne dans ASP.NET C #

Soit 40595 pa

finirait avec 40595

Merci

StevieB
la source
3
Voici votre réponse: stackoverflow.com/questions/262448/…

Réponses:

237

Il y a plusieurs façons, mais cela devrait faire (je ne sais pas comment cela fonctionne avec de très grosses chaînes):

private static string GetNumbers(string input)
{
    return new string(input.Where(c => char.IsDigit(c)).ToArray());
}
Fredrik Mörk
la source
21
Vous devriez probablement utiliser IsDigitplutôt que IsNumber: "Cette méthode [ IsNumber] détermine si a Charappartient à une catégorie Unicode numérique. En plus d'inclure des chiffres, les nombres incluent des caractères, des fractions, des indices, des exposants, des chiffres romains, des numérateurs de devises et des nombres encerclés. Cette méthode contraste avec la IsDigitméthode, qui détermine si a Charest un chiffre de base à 10. " msdn.microsoft.com/en-us/library/yk2b3t2y.aspx
LukeH
2
@TrevorBrooks Supposons que vous puissiez simplement développer les termes:input.Where(c => char.IsDigit(c) || char.IsWhiteSpace(c))
Fredrik Mörk
6
On peut le simplifier davantage return new string(input.Where(char.IsDigit).ToArray());. Je le rend juste plus lisible
Zapnologica
2
Bonne réponse. Pourrait simplement envisager de renommer la fonction de «GetNumbers» en «GetDigits» également ... pour clarifier son intention.
JTech
2
Fait également une excellente méthode d'extension.
Roberto Bonini
61

Se sent comme un bon ajustement pour une expression régulière.

var s = "40,595 p.a.";
var stripped = Regex.Replace(s, "[^0-9]", "");

"[^0-9]"peut être remplacé par @"\D"mais j'aime la lisibilité de [^0-9].

Jonas Elfström
la source
1
Je serais d'accord tant que vous êtes d'accord avec la surcharge associée aux expressions régulières dans .Net
FrankO
4
Par curiosité, quelle est la surcharge de performance entre cette réponse et la réponse de Fredrik Mork?
Scuba Steve
C'est probablement plus lent, mais le seul moyen de le savoir est de mesurer, car cela dépend de la façon dont .NET implémente les expressions régulières, de la façon dont l'expression Lambda est compilée, etc.
Jonas Elfström
1
C'est plus flexible que d'utiliser IsDigit () car vous pouvez ajouter '.' caractères à l'expression régulière si vous souhaitez autoriser les nombres avec des décimales.
Richard Moore
10
J'ai fait une simple comparaison entre Regex et LINQ sur une chaîne construite à partir de 100 000 GUID réunis (résultant en une chaîne de 3 600 000 caractères). Regex était toujours autour d'une demi-seconde, alors que LINQ était toujours dans le 1/10 de seconde. Fondamentalement, LINQ était 5 fois ou plus plus rapide en moyenne.
Chris Pratt
8

Une méthode d'extension sera une meilleure approche:

public static string GetNumbers(this string text)
    {
        text = text ?? string.Empty;
        return new string(text.Where(p => char.IsDigit(p)).ToArray());
    }
Ercan Ayan
la source
Je préfère if (text == null) return string.Empty;plus text = text ?? string.Empty;. De cette façon, nous ne diminuons pas les performances.
Hooman
6

Utilisez une expression régulière qui ne capture que 0-9 et rejette le reste. Une expression régulière est une opération qui coûtera cher la première fois. Ou faites quelque chose comme ça:

var sb = new StringBuilder();
var goodChars = "0123456789".ToCharArray();
var input = "40,595";
foreach(var c in input)
{
  if(goodChars.IndexOf(c) >= 0)
    sb.Append(c);
}
var output = sb.ToString();

Quelque chose comme ça je pense, je n'ai pas compilé cependant ..

LINQ est, comme l'a dit Fredrik, également une option

Onkelborg
la source
4

Une autre option ...

private static string RemoveNonNumberDigitsAndCharacters(string text)
{
    var numericChars = "0123456789,.".ToCharArray();
    return new String(text.Where(c => numericChars.Any(n => n == c)).ToArray());
}
kernowcode
la source
2
qu'en est-il négatif? (-) Le moins ne devrait-il pas faire partie de cela?
Seabizkit
3
public static string RemoveNonNumeric(string value) => Regex.Replace(value, "[^0-9]", "");
Patrick Cairns
la source
cela fonctionnera pour moi après avoir autorisé les décimales.
John Lord il y a
0

Eh bien, vous savez quels sont les chiffres: 0123456789, non? Parcourez votre chaîne caractère par caractère; si le caractère est un chiffre, placez-le à la fin d'une chaîne temporaire, sinon ignorez. Il peut y avoir d'autres méthodes d'assistance disponibles pour les chaînes C #, mais c'est une approche générique qui fonctionne partout.

Tim
la source
0

Voici le code utilisant des expressions régulières:

string str = "40,595 p.a.";

StringBuilder convert = new StringBuilder();

string pattern = @"\d+";
Regex regex = new Regex(pattern);

MatchCollection matches = regex.Matches(str);

foreach (Match match in matches)
{
convert.Append(match.Groups[0].ToString());
}

int value = Convert.ToInt32(convert.ToString()); 
dhirschl
la source
Que dois-je faire pour obtenir Regex Working obtenant cette erreur Le nom 'Regex' n'existe pas dans le contexte actuel
StevieB
using System.Text.RegularExpressions;
dhirschl
0

La réponse acceptée est excellente, mais elle ne prend pas en compte les valeurs NULL, ce qui la rend inutilisable dans la plupart des scénarios.

Cela m'a poussé à utiliser ces méthodes d'aide à la place. Le premier répond à l'OP, tandis que les autres peuvent être utiles pour ceux qui veulent effectuer le contraire:

    /// <summary>
    /// Strips out non-numeric characters in string, returning only digits
    /// ref.: /programming/3977497/stripping-out-non-numeric-characters-in-string
    /// </summary>
    /// <param name="input">the input string</param>
    /// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
    /// <returns>the input string numeric part: for example, if input is "XYZ1234A5U6" it will return "123456"</returns>
    public static string GetNumbers(string input, bool throwExceptionIfNull = false)
    {
        return (input == null && !throwExceptionIfNull) 
            ? input 
            : new string(input.Where(c => char.IsDigit(c)).ToArray());
    }

    /// <summary>
    /// Strips out numeric and special characters in string, returning only letters
    /// </summary>
    /// <param name="input">the input string</param>
    /// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
    /// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZAU"</returns>
    public static string GetLetters(string input, bool throwExceptionIfNull = false)
    {
        return (input == null && !throwExceptionIfNull) 
            ? input 
            : new string(input.Where(c => char.IsLetter(c)).ToArray());
    }

    /// <summary>
    /// Strips out any non-numeric/non-digit character in string, returning only letters and numbers
    /// </summary>
    /// <param name="input">the input string</param>
    /// <param name="throwExceptionIfNull">if set to TRUE it will throw an exception if the input string is null, otherwise it will return null as well.</param>
    /// <returns>the letters contained within the input string: for example, if input is "XYZ1234A5U6~()" it will return "XYZ1234A5U6"</returns>
    public static string GetLettersAndNumbers(string input, bool throwExceptionIfNull = false)
    {
        return (input == null && !throwExceptionIfNull) 
            ? input 
            : new string(input.Where(c => char.IsLetterOrDigit(c)).ToArray());
    }

Pour plus d'informations, lisez cet article sur mon blog.

Darkseal
la source
-1
 var output = new string(input.Where(char.IsNumber).ToArray());
Emre Sevim
la source