6
votes

Expression régulière pour éliminer mille séparateur de la chaîne numérique?

J'ai des chaînes contenant de mille séparateurs, mais aucune fonction de chaîne à numéros ne veut la consommer correctement (à l'aide de JavaScript). Je pense à "préparer" la ficelle en décapant les milliers de séparateurs, laissant toute chose non voté et laissant numéro code> parseint code> / parsfloat code> Fonctions ( Je suis satisfait de leur comportement autrement) de décider du reste. Mais il semble que je n'ai aucune idée de ce que Regexp peut faire cela!

Les meilleures idées sont les bienvenues aussi! P>

Mise à jour: H2>

Désolé, vous avez éclairé à quel point Formulé question c'est. Ce que je suis triyng à atteindre est le suivant: 1) Soutenir des milliers de séparateurs que si tout, mais 2) pour ne pas déranger beaucoup la chaîne d'origine, je vais donc obtenir des nans dans les cas de chiffres non valides. P>

Plus Mise à jour: h2>

JavaScript est limité à la locale anglaise pour analyse, alors supposons que mille séparateur est "," pour la simplicité (naturellement, il ne correspond jamais à un séparateur décimal dans une locale, de sorte que la modification de tout autre local ne doit pas poser de problème. ) P>

Maintenant, sur les fonctions d'analyse: P>

parseFloat('1023.95BARGAIN BYTES!')  // parseXXX functions just "gives up" on invalid chars and returns 1023.95
Number('1023.95BARGAIN BYTES!')      // while Number constructor behaves "strictly" and will return NaN


8 commentaires

Votre séparateur est-il une virgule ou un point? C'est-à-dire que douze milliers représentaient que '12, 000 'ou comme "12 .000 "? (Ou autre chose?)


@RUAKH, en fait un espace, mais ce n'est pas pertinent, car JavaScript n'est pas du tout capable.


Il est pertinent, car votre regex devra savoir quel séparateur à supprimer!


Veuillez donner un exemple de la chaîne avant et après, par exemple: 12 345 678 ==> 12345678 ou Il a dit: "Je viens de gagner 25 000 000 $! !! ' ==> Il a dit: "Je viens de gagner $ 25000000 !!!' ou Il y a 5 280 pieds dans un mile, non? ==> Il y a 5280 pieds dans un mile, non? ou quoi que ce soit que vous puissiez penser à


@Code jockey, j'ai mis à jour la question, j'espère que c'est mieux


Je pense que nous allons toujours avoir besoin de plus. "il est peu probable que ce soit correct" n'est pas très clair. Que doit faire le code? Quel devrait être le résultat?


@Jan Kuča, consultez mon dernier commentaire à votre réponse. Étant donné que '1,0,2,3,99' ne contient pas de milliers de séparateurs valides, le code ne doit pas les dépouiller, causer parsfloat pour "abandonner" et retourner 1 et numéro pour renvoyer nan


Cette expression régulière a fonctionné pour moi :, (? = \ d {3})


7 Réponses :


2
votes

dépend de ce que votre mille séparateur est xxx

supprimerait les espaces et les virgules.


2 commentaires

Les chaînes javascript n'ont pas de méthode de remplacement . Peut-être que tu penses à Java?


@ruakh: Ouais, j'avais réparé au moment où votre commentaire a eu lieu. ;)



4
votes

Un simple num.replace (/, / g, '') devrait être suffisant, je pense.


3 commentaires

Mais si si le chiffre d'entrée n'est pas bien formé, par exemple '1,02,4' ?


Eh bien, ce ne sont pas mille séparateurs. Si cela devrait être interprété comme 1024, le code pour obtenir cette valeur est identique.


Le problème est la suivante: une approche simple prendra ces mille séparateurs et j'obtiendrai 1024 pendant les résultats corrects (pour l'environnement JavaScript) parseint ('1,02,4') == 1 , numéro (code> '1,02,4') == nan



1
votes

Cela devrait fonctionner pour vous

var decimalCharacter = ".",
    regex = new RegExp("[\\d" + decimalCharacter + "]+", "g"),
    num = "10,0000,000,000.999";
+num.match(regex).join("");


0 commentaires

1
votes

Pour confirmer qu'une chaîne de numéraire est bien formée, utilisez: xxx pré>

qui retournera true code> si la chaîne numérique est soit (1) seulement une séquence de zéro ou plus de chiffres, ou (2) une séquence de chiffres avec une virgule avant chaque ensemble de trois chiffres, ou (3) soit par rapport à un caractère non chiffré et qui sait quoi d'autre. (Le cas n ° 3 est destiné aux flotteurs, ainsi que de vos "octets de négociation!" Exemples.) P>

Une fois que vous avez confirmé cela, utilisez: P>

numeral_string.replace(/,/g, '')


0 commentaires

7
votes

welp, je m'aventuerai de jeter ma suggestion dans la casserole:

Remarque: révisé stry> p> xxx pre>

devrait tourner p >

(\b\d{1,3}),(?=\d{3}(\D|$))


5 commentaires

Je suppose que j'ai trouvé un bug, '30, 0300'.replace (/ (\ d +), (? = \ D {3}) / g, "1 $") Soutienne toujours une virgule. Comment puis-je ajuster l'affirmation de Lookahead à s'arrêter après exactement 3 chiffres?


.replace (/ (\ d +), (? = \ d {3}) (\ d | $) / g, "1 $ 1 $ 2");


@Jan Kuča, '1 030 000'.eplace (/ (\ d +), (? = \ D {3}) (\ d | $) / g, "1 0,030 $) retourne" 1 030 000 "


@ user539484 - La solution que vous croyez que la recherche a été ajoutée à ma réponse. Il est assez proche de la solution Jan Kuča proposée, mais inclut la correspondance non chiffrée à l'intérieur de l'assertion de la recherche.


@ Jankuča - très proche, sauf que la mise en place de l'assignation «non chiffrée ou d'affirmation de fin» ne doit pas faire partie du match, mais une partie de l'affirmation de l'apparence. Lorsqu'il est exprimé dans le cadre du match, il rejette toutes les correspondances valides car elles sont tentées sur les mêmes caractères que le précédent look-avance. Après avoir assorti un ou plusieurs numéros, il correspond à la virgule. Il a ensuite l'air d'affirmer qu'il y a trois chiffres supplémentaires. S'il y a trois chiffres, une correspondance «non chiffre ou extrémité» est impossible.



1
votes

J'ai utilisé ce qui suit dans un paramètre commercial et il a fonctionné souvent:

numérostr = numérostr.replace (/ [.,] (\ d \ d \ d \ d | \ d \ d \ D $) / g, '$ 1'); code> p>

dans l'exemple ci-dessus, des milliers peuvent être marqués d'une décimale, d'une virgule ou d'un espace. P>

Dans certains cas (comme un prix de 1000,5 euros), ce qui précède ne fonctionne pas. Si vous avez besoin de quelque chose de plus robuste, cela devrait fonctionner 100% du temps: P>

//convert a comma or space used as the cent placeholder to a decimal
$priceStr = $priceStr.replace(/[, ](\d\d$)/,'.$1');
$priceStr = $priceStr.replace(/[, ](\d$)/,'.$1');
//capture cents
var $hasCentsRegex = /[.]\d\d?$/;
if($hasCentsRegex.test($priceStr)) {
    var $matchArray = $priceStr.match(/(.*)([.]\d\d?$)/);
    var $priceBeforeCents = $matchArray[1];
    var $cents = $matchArray[2];    
} else{
    var $priceBeforeCents = $priceStr;
    var $cents = "";
}
//remove decimals, commas and whitespace from the pre-cent portion
$priceBeforeCents = $priceBeforeCents.replace(/[.\s,]/g,'');
//re-create the price by adding back the cents
$priceStr = $priceBeforeCents + $cents;


0 commentaires

1
votes

Vous pouvez utiliser s.replaceall ("(\\ w) (? = \\ d {3})", "");

Cette regex obtient tout caractère alphanumérique avec 3 caractères après elle.

cordes comme 4.444.444.444,00 € sera 4444444444,00 €


0 commentaires