C++ IsFloat fonction
Quelqu'un connais un moyen pratique de déterminer si une valeur de chaîne "qualifie" comme un nombre à virgule flottante?
bool IsFloat( string MyString )
{
... etc ...
return ... //true if float; false otherwise
}
- Si c'est censé être du C++ tu veux dire "bool", "vrai" et "faux" et non pas "BOOL", etc.
- Il est probablement en utilisant les Api de Windows, ...
Vous devez vous connecter pour publier un commentaire.
Si vous ne pouvez pas utiliser un coup de pouce de la bibliothèque de fonction, vous pouvez écrire votre propre isFloat fonction comme ceci.
float f = 256;
compile, n'est-ce pas?Vous pouvez, comme de Boost lexical_cast (voir http://www.boost.org/doc/libs/1_37_0/libs/conversion/lexical_cast.htm).
Vous pouvez utiliser istream pour éviter de devoir renforcer, mais franchement, Boost est tout simplement trop bon de laisser de côté.
Inspiré par cette réponse j'ai modifié la fonction pour vérifier si une chaîne est un nombre à virgule flottante. Il ne nécessitera pas de boost & ne repose sur stringstreams failbit n' - c'est tout simplement de l'analyse.
I. e.
est reconnu par correctement cette fonction en tant que float.
Sont des exemples de non-valide flotteurs. Si vous ne voulez pas reconnaître les nombres à virgule flottante au format X. XXf, il suffit de retirer la condition:
à partir de la ligne 9.
Et si vous ne voulez pas reconnaître les nombres sans '.' comme float (c'est à dire non, '1', seulement '1.', '1.0', '1.0 f'...) vous pouvez ensuite modifier la dernière ligne:
Cependant: Il y a beaucoup de bonnes raisons pour utiliser le boost de lexical_cast ou la solution à l'aide de stringstreams plutôt que cette "laide de la fonction'. Mais Il me donne plus de contrôle sur ce genre de formats exactement, je tiens à souligner que les nombres à virgule flottante (c'est à dire maximum de chiffres après le point décimal...).
J'ai récemment écrit une fonction pour vérifier si une chaîne est un nombre ou pas. Ce numéro peut être un Entier ou flottant.
Vous pouvez tourner mon code et ajouter quelques tests unitaires.
J'imagine que vous voulez exécuter une regex match sur la chaîne d'entrée. Je pense qu'il peut être assez compliqué pour tester tous les cas de bord.
Ce site a quelques bonnes infos. Si vous voulez juste pour passer à la fin il dit:
^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$
Qui, fondamentalement, a de sens que si vous comprenez l'expression rationnelle de la syntaxe.
[EDIT: Correction d'interdire initiale espaces de début et de fin de bêtises.]
Vous pouvez facilement transformer cela en une fonction de type "modèle" sur un type
T
au lieu defloat
. C'est essentiellement ce que du coup de pouce lexical_cast n'.Vous pouvez utiliser les méthodes décrites dans Comment puis-je convertir chaîne double en C++?, et au lieu de lancer un
conversion_error
, retourfalse
(indiquant que la chaîne ne représente pas unfloat
), ettrue
autrement.C++11 solution à l'aide de
std::stof
:Je cherchais quelque chose de semblable, a trouvé un moyen beaucoup plus simple de répondre que ce que j'ai vu;
ou:
Espérons que cette aide !
ZMazz
Vous pouvez utiliser atof et ensuite avoir un traitement spécial pour
0.0
, mais je ne pense pas que ce qui compte comme une très bonne solution.C'est une question de la SORTE. Regardez cette question des suggestions (cette question traite de la chaîne->int, mais les approches sont les mêmes).
Remarque: pour savoir si la chaîne peut être converti, vous avez essentiellement pour faire la conversion pour vérifier les choses comme/underflow.
Ce que vous pourriez faire est d'utiliser un istringstream et retourner vrai/faux sur la base du résultat de la rivière de l'opération. Quelque chose comme ceci (attention - je n'ai même pas compilé le code, c'est une directive uniquement):
cela dépend du niveau de confiance, vous avez besoin et où les données d'entrée vient de.
Si les données proviennent d'un utilisateur, vous devez être plus prudent, par rapport à l'importation de données de la table, où vous savez déjà que tous les éléments sont soit des entiers ou des flotteurs et c'est seulement ce dont vous avez besoin pour faire la différence.
Par exemple, l'un des plus rapides des versions, serait tout simplement de vérifier la présence de "." et "eE" en elle. Mais ensuite, vous voudrez peut-être chercher si le reste est en cours de tous les chiffres. Ignorer les espaces blancs au début - mais pas dans le milieu, vérifier d'un seul "." "eE", etc.
Ainsi, la q&d rapide hack va probablement conduire à une solution plus sophistiquée regEx comme (soit appeler ou numériser vous-même) approche. Mais alors, comment savez-vous que le résultat - bien que ressemblant à un flotteur peut vraiment être représentés au sein de votre machine (c'est à dire essayer 1.2345678901234567890e1234567890). Bien sûr, vous pouvez faire une regEx avec "up-to-N" chiffres de la mantisse/exposant, mais c'est la machine/OS/compilateur ou que ce soit spécifique, parfois.
Donc, à la fin, pour être sûr, vous avez probablement à l'appel à la sous-jacentes du système de conversion et de voir ce que vous obtenez (à l'exception, de l'infini ou NAN).
Je serais tenté d'ignorer menant des espaces que c'est ce que le
atof
fonction ne aussi:Donc, ce match nous:
J'ai toujours aimé
strtof
car il vous permet de spécifier une fin pointeur.Cela fonctionne parce que la fin d'un pointeur sur le caractère où l'analyse a commencé à échouer, donc si c'points pour un nul-terminator, puis l'ensemble de la chaîne a été analysée comme un float.
Je suis surpris que personne n'a mentionné cette méthode en 10 ans, cette question a été autour, je suppose, parce que c'est plus un C-Style façon de faire. Cependant, il est toujours parfaitement valide en C++, et de plus élégant que n'importe quel flux de solutions. En outre, il fonctionne avec un "+inf" "-inf" et ainsi de suite, et ignore les principaux espaces.