2010-10-28 10 views
1

(\d+(?:\.\d+)?)\D*$ - cette regex extrait le prix de n'importe quelle chaîne avec le point décimal, mais je veux extraire le point décimal seulement quand il y a quelque chose mais pas zéro comme quand 300.50 ou 300.25 alors le point décimal devrait être extrait mais s'il est 300.00 alors le point décimal ne doit pas être extrait, que faire?Regex pour le prix

C'est ok, ou une meilleure solution est là?

Match match = Regex.Match(cellRecord, @"(\d+(?:\.\d+)?)\D*$"); 
price = match.Groups[1].Value.ToString().Trim(); 
if (price.Substring(price.Length - 3, 3) == ".00") 
{ 
    price = price.Replace(".00", ""); 
} 
+0

Je me demande quelle est la syntaxe de '(?: \. \ D +)' ... si vous pouvez le rendre plus communément utilisé regex, (plus d'expression régulière "régulière" ...) peut-être plus de gens connaissent la réponse . –

+2

Ne serait-il pas préférable de le charger dans un Decimal (Decimal.Parse (...)) et de décider du format de la chaîne lors de sa sortie? Analyse syntaxique vs modèle de domaine vs présentation, un peu. – sisve

Répondre

0

Cette expression régulière devrait fonctionner pour les entrées que vous avez mentionnées. S'il vous plaît voir la sortie ci-dessous.

"\b(\d+(?:\.(?:[^0]\d|\d[^0]))?)\b" 

fonctionne comme suit

input OPTIDX 26FEB2009 NIFTY CE 2800 
output 2800 

input 123.00 
output 123 

input 123.06 
output 123.06 

input 123.50 
output 123.50 
1

En supposant par une meilleure façon que vous voulez dire « peut faire une expression régulière sur son propre? » puis:

([0-9]+(?:\.(?:[1-9][1-9]|[0-9][1-9]|[1-9][0-9]))?)(?=[^0-9]) 

placera des correspondances dans le premier regroupement d'expressions rationnelles. Ce que cette regex fait est de faire correspondre n'importe quel nombre et ensuite pour la partie "cents" permettant n'importe quelle combinaison de nombres sauf 00. Notez également que cela correspond à des valeurs avec deux chiffres dans la partie "cents". Notez que cette expression rationnelle utilise [0-9] au lieu de \ d pour rendre un peu plus clair les chiffres qui sont acceptables.

Editer: Veuillez noter que cette regex a été testée en GNU/Emacs et non en C#, mais je ne pense pas qu'il y ait de différence dans ce cas.

Modifier: J'ai fait une petite erreur où l'expression rationnelle correspondait à '300'. pas '300', regex ajusté ne regroupe la période que s'il y a correspondance.

+0

+1 Merci beaucoup, ça marche très bien .. – Harikrishna

+0

cela ne fonctionne pas pour OPTIDX 26FEB2009 NIFTY CE 2800. Il correspond à la date ici comme 26. – Harikrishna

+0

@Harikrishna Votre question initiale a donné des critères de pénétration très précis, cette question entre dans détails spécifiques au problème. Par exemple, si vous savez que toutes les valeurs "temps" sont suivies par des espaces, vous pouvez ajuster la partie positive de la regex ... qui est '(? = [^ 0-9])' pourrait être changé en '(? = \ s) '. Cela provoque une correspondance uniquement lorsque le "temps" est suivi d'un espace au lieu d'une correspondance qui se produit lorsque l'heure est suivie de tout sauf d'un nombre. Vous pouvez également exclure tous les caractères alphanumériques de '(? = [^ 0-9a-zA-Z])'. – nixeagle

3

Je voudrais également étudier l'utilisation de Double.Parse avec les bonnes informations de culture - ceci est généralement beaucoup plus simple et plus stable que d'utiliser votre propre expression régulière.