La conversion de mots pour les nombres en PHP
Je suis en train de convertir des valeurs numériques de l'écrit que les mots en entiers. Par exemple,
"l'iPhone a deux cent trente mille sept cent quatre-vingt-trois apps"
allait devenir
"l'iPhone comme 230783 apps"
Avant que je commencer à coder, je voudrais savoir si une fonction /code existe pour cette conversion.
OriginalL'auteur user132513 | 2009-07-03
Vous devez vous connecter pour publier un commentaire.
Il ya beaucoup de pages de discuter de la conversion de nombres de mots. Pas tant pour le sens inverse. Le meilleur que j'ai pu trouver était de pseudo-code de Demander à Yahoo. Voir http://answers.yahoo.com/question/index?qid=20090216103754AAONnDz pour un bon algorithme:
+1 Jean - Vos réponses sont toujours super.
Pourquoi sommes-nous le traitement de jetons à partir de la droite ?
il est plus facile pour le code 🙂
J'ai ajouté une réponse ci-dessous qui met en œuvre un vaguement algorithme similaire.
OriginalL'auteur John Kugelman
Vieille question, mais pour quelqu'un d'autre de venir à travers ce que je devais écrire une solution à cela aujourd'hui. Le suivant prend une vague approche similaire à l'algorithme décrit par Jean Kugelman, mais ne s'applique pas aussi stricte de la grammaire; comme tel, il sera permis à certains bizarre ordre, par exemple, de "cent mille et un million" sera toujours produire le même comme "un million et cent mille" (de 1 100 000). Non valide bits (par exemple, mal orthographié numéros) sera ignorée, donc le considérer de la sortie sur les chaînes non valides pour être indéfini.
Suivantes user132513 commentaire de joebert réponse, j'ai utilisé de Poire est Number_Words de générer des séries de tests. Le code suivant a marqué 100% sur les nombres entre 0 et 5 000 000 de 100% sur un échantillon aléatoire de 100 000 numéros entre 0 et 10 000 000 (il faut de temps à s'exécuter sur l'ensemble de 10 milliards de dollars de la série).
'lakh' => '100000'
et'crore' => '10000000'
comme mentionné par user132513 dans joeberts réponse.Un cas d'utilisation où cela ne fonctionne pas, par exemple
$data= 'five or ten'
. Cela renvoie 50. La réponse ci-dessus fonctionne bien pour l'OP. Cependant, on doit considérer la chaîne d'avoir de la "bonne" mise en forme. Dans mon cas, j'ai essayé de dépouiller le numéro d'une chaîne non contrôlée, sans contrôle de gestion (ou de savoir) ce que la chaîne pourrait être. Les utilisateurs sont parfois mettre certaines assez étrange réponses dans les formulaires!"Non valide bits (par exemple, mal orthographié numéros) sera ignorée, donc le considérer de la sortie sur les chaînes non valides pour être indéfini"; malheureusement, c'est seulement destiné à convertir une chaîne de caractères contenant un numéro unique. Vous pourriez essayer la division de votre chaîne en fragments à l'aide de la
$data
liste ci-dessus (ceux sont les seuls sous-chaînes que nous nous soucions) et ensuite l'exécuter sur chaque fragment, puis de combiner les résultats à l'aide de la fractionner les mots.Il fonctionne bien , Sauf que si le $data la valeur est Dix au lieu de dix ensuite, il retourne 0 au lieu de 10 . Veuillez aider à sortir de ce sensibilité à la casse mate.
Je recommanderais ce qui en fait la première ligne:
$data = strtolower(trim($data));
. Cela répond à la remarque faite par @RajaGopalOriginalL'auteur El Yobo
Je n'ai pas testé ce trop largement, j'ai plus ou moins juste travaillé sur elle jusqu'à ce que j'ai vu ce que j'attendais à la sortie, mais il semble fonctionner, et l'analyse à partir de la gauche-à-droite.
Il sera également mess avec certaines formulations pour les dates. "Je suis né dans dix-neuf quatre-vingt-un"
Merci beaucoup Joebert pour le code! Je vais essayer de l'améliorer. J'ai mis en place un ensemble de test de 10000 nombre aléatoire de mots (à l'aide de la Numbers_Words) et actuellement, la précision du décodage des mots pour les nombres est de 75%. Correct : quarante-cinq mille cinq cent cinquante-quatre devient 45554 Incorrect: cinquante et un mille cinq cent quatre-vingt-six devient 586
Viens de réaliser le problème. Il y a quelque chose de drôle qui se passe lors de l'accès à la première clé, c'est à dire " un "au Lieu de mettre le quadrillion' => '1000000000000000" avant de " un " et il travaille avec une précision de 100%.
Aussi, figurent "lakh' => '100000' et 'crore' => '10000000' dans $clés. Ils sont plus fréquents en termes de millions de dollars dans les pays d'asie du sud
OriginalL'auteur joebert
Quelque peu mis à jour El Yobo's réponse, maintenant on peut courir wordsToNumber fonction de (presque) toute chaîne de caractères contenant des chiffres. Voir le test ci-dessous.
OriginalL'auteur thefish
La POIRE
Numbers_Words
paquet est probablement un bon début: http://pear.php.net/package-info.php?package=Numbers_WordsOriginalL'auteur Jani Hartikainen
Vous avez mentionné certains d'erreur de script, veuillez vérifier une fois que les développeurs du point de vue ex: 83139 si vous l'avez demandé dans les mots, il donnera la réponse différente
passer une chaîne de caractères par un soufflet mentionné et de vérifier tous les :
"bus nombre de quinze, arrêt de bus numéro quatre-vingt-trois mille cent trente-neuf"
OriginalL'auteur Thejeswara Reddy