Je veux savoir si une chaîne a des chiffres ou s'il n'y a pas de chiffres. Y a-t-il une fonction qui le fait facilement? P>
6 Réponses :
Peut-être ce qui suit:
Cela nécessite des étapes O (10 * N). Un Solution avec Find_IF CODE> ou Find_any code> est plus rapide, nécessitant uniquement O (n) étapes.
donnée std :: string s;
boost::regex re("[0-9]");
const std::string src = "test 123 test";
boost::match_results<std::string::const_iterator> what;
bool search_result =
boost::regex_search(src.begin(), src.end(), what, re, boost::match_default);
modification wind_first_of code> est probablement votre meilleur pari, mais je joue avec des facettes iostream, voici une alternative: chaîne Code> à wstring code> et char code> à wchar code> et vous pourriez théoriquement avoir une chance de manipuler ces bizarres de largeur fixe utilisée dans certains scripts asiatiques. p> p>
kewl, un uppote. Malheureusement, j'ai essayé cela plus tard (dans Mac OS X, qui a des locaux quelque peu lâches) et les chiffres FULLWIDTH ont été non numériques.
#include <cctype>
#include <algorithm>
#include <string>
if (std::find_if(s.begin(), s.end(), (int(*)(int))std::isdigit) != s.end())
{
// contains digit
}
C'est bizarre, en VC ++, la distribution n'est pas nécessaire et, dans GNU, il n'est pas nécessaire que si vous supprimez la pièce std :: code> avant isdigit code>. Quelqu'un sait pourquoi c'est le cas?
@Manuel: à l'aide de code>, sur Mac OS X au moins . §17.4.1.2 / 4 semblerait dire que cette méthodologie est illégale et :: isdigit code>. Pourrait-il être une non-conformité intentionnelle?
@Potatoswatter - VSC ++ 2008 fait la même chose, non seulement pour CTYPE code> mais pour toute la bibliothèque C STD. Quoi qu'il en soit, cela ne répond pas pourquoi la version avec std :: code> en avant nécessite une distribution.
C'est parce que le isdigit code> à partir de int (*) (int) code> déjà. std :: isdigit code> est un modèle, donc sans la distribution, elle est ambiguë. C'est dans :: isdigit code> est une fonction particulière, alors que std :: isdigit code> est surchargé comme fonction de int code>, mais sans la distribution, ils ne peuvent pas être exclus.
@Steve - merci pour la grande explication, j'avais oublié locale code>
Il n'y a rien de standard à cet effet, mais il n'est pas difficile de faire un: et vous pouvez l'utiliser comme: p> ou même meilleure version em> (car elle peut fonctionner avec n'importe quel conteneur et avec des conteneurs Const et non-Const): P> const std::string str("abcde123xyz");
printf("Has digits: %s\n", has_digits(str.begin(), str.end()) ? "yes" : "no");