9
votes

Chaîne de prix à flotter

J'aime convertir une chaîne avec un prix à une valeur de flotteur. Le prix provient de différentes langues et de pays et peut ressembler à ceci:

 1,00 €
 € 1.00
 1'000,00 EUR
 1 000.00$
 1,000.00$
 1.000,00 EURO

php

5 commentaires

Pourquoi sans regex? Qui vous limite grandement ...


L'entrée est donc variable, même lorsque des points et des zéros peuvent signifier des milliers de séparateur ou de point décimal .. Et vous pensez qu'il y a un marteau magique pour cela, pour toutes les entrées possibles que vous pourriez recevoir de vos utilisateurs?


@Nick j'ai dit "préférer" parce que je pense queregexp sont difficiles à lire et difficiles à entretenir. Mais je les utiliserais toujours si j'ai besoin de.


@ N.b. C'est le fait que nous sommes confrontés à voir ICI et ici . Et alors je pense que les autres avaient déjà été confrontés à ce problème. Un marteau magique serait bien!


Je reçois le problème que vous avez, mais le problème est que vous n'avez pas l'entrée constante. Parfois, vous avez 1 000,00 qui représente mille. Vous avez aussi 1000.00 qui est à nouveau 1 mille. Vous pouvez également avoir 100,00 qui est une centaine (dans mon pays, nous n'utilisons pas le point de séparateur décimal). La question est donc de savoir comment interpréter les prix que vous rencontrez, il peut varier. Vous devez définir des règles de base, telles que ce qui est le séparateur décimal et quels milliers de séparateur. Après cela, il est trivial pour déterminer le prix - ignorez tout ce qui n'est pas . ou , ou le caractère numérique.


6 Réponses :


3
votes

Suppression de tous les caractères non numériques devrait vous donner le prix en cents. Vous pouvez ensuite diviser cela par 100 pour obtenir le prix «lisible humain». Vous pouvez faire cela avec quelque chose comme le filtre_var filtre_sanitize_number_int. Par exemple:

$cents = filter_var($input, FILTER_SANITIZE_NUMBER_INT);
$price = floatval($cents / 100);


0 commentaires

2
votes

Cette fonction corrigera votre problème: xxx


3 commentaires

Merci! Cela fonctionne très bien pour la plupart des cas. J'ai toujours trouvé quelques exemples que la fonction a des problèmes avec des "22 000,76" et "22.000". J'ai essayé de construire mon version propre .


Je l'ai résolu avec les cas que vous avez fournis et cela fonctionne parfaitement maintenant.


+1 fonctionne bien maintenant. Bien fait! Cette nuit une bonne idée, je peux faire la même chose maintenant dans trois lignes. Vérifiez-le.



1
votes

Pour supprimer tous les chiffres, les virgules et les arrêts complets: xxx

sortie: xxx

permet d'utiliser la fonction Paysfloat de < un href = "http://uk.php.net/manual/fr/funcunction.floatval.php#84793" rel = "nofollow"> Michel - php.net (je ne le collerai pas ici depuis C'est une assez grande fonction): xxx

sortie sera: xxx


3 commentaires

Bien merci! J'ai aussi essayé Michiel fonction aussi mais je ne l'ai pas fait fonctionner bien. Votre solution a des problèmes avec "22 000,76" et "22.000". J'ai donc essayé de construire mon version propre .


Ce qui précède ne devrait avoir aucun problème avec "22 000,76" en supposant que cela signifie "22000,76" et non "2200076.00". Cependant, votre 2e exemple ne fonctionnera pas car ce n'est pas un flotteur. Un simple contrôle sur le 3ème dernier caractère résoudrait cela.


Peut-être que j'ai fait quelque chose de mal, mais parsfloat_nick () a retrouvé un étrange "0" <0 " pour moi .



18
votes

OK, je l'ai essayé moi-même. Que pensez-vous de cela? XXX

Voici quelques tests: http://codepad.org / Ytihqsgz

désolé. Je ne pouvais pas inclure les autres fonctions car Codonepad ne les a pas aimés. Mais je les ai comparé et il y avait des problèmes avec des chaînes comme "22 000,76" ou "22.000"

Mise à jour: comme ISA illimitée signalé que vous avez peut-être consulté la fonction de construction de la fonction Format monétaire .


5 commentaires

On dirait que ça devrait faire l'affaire. Juste hors de curiosité, l'approche filtrante_var n'a pas fonctionné pour vous?


@Oldskool the filter_var solutions est très sympa! Mais cela ne fonctionne pas pour les prix sans cents.


Vous devez ajouter le drapeau filtre_var ($ prix, filtre_sanitize_number_float, filtre_flag_allow_fraction);


@Jacobthomason Je cours mes tests avec cette fonction, mais elle échoue dans de nombreux cas même avec un simple "1,00": CodePad.org / Uax6hnar


N'oubliez pas de chiffres négatifs.



2
votes

prix au numéro nombre à des exemples de prix xxx


1 commentaires

J'ai ajouté .utf-8 à lc_monétary et essayé mes chaînes de test mais qui ne fonctionnaient pas très bien: codépad.org/s00ifyR5 de toute façon Money_Format INSTRUCTING!



0
votes

pas parfait, mais ça marche xxx

cas de travail xxx

retour xxx


0 commentaires