J'ai plusieurs cordes, certains comme "45", certains, comme "45px". Comment je convertir à la fois de celles-ci au nombre de 45?
Réponses
Trop de publicités?Nouvelle réponse
J'aime snrobot la réponse de mieux. À l'aide de la méthode Java est plus simple et plus robuste que d'utiliser la lecture de la chaîne pour ce cas simple d'utilisation. J'ai fait quelques petites modifications. Étant donné que l'auteur n'exclut pas les nombres négatifs, j'ai ajusté pour permettre les nombres négatifs. J'ai aussi fait en sorte qu'elle exige le nombre de départ au début de la chaîne.
(defn parse-int [s]
(Integer/parseInt (re-find #"\A-?\d+" s)))
En outre, j'ai trouvé que Entier/parseInt s'analyse comme décimal lorsque le pas de base est donnée, même si il y a des zéros à gauche.
Vieille réponse
Tout d'abord, analyser simplement un entier (puisque c'est un coup sur google et c'est bon informations d'arrière-plan):
Vous pouvez utiliser le lecteur:
(read-string "9") ; => 9
Vous pouvez vérifier que c'est un numéro après l'avoir lu:
(defn str->int [str] (if (number? (read-string str))))
Je ne suis pas sûr si la saisie de l'utilisateur peuvent être approuvées par le clojure lecteur ainsi, vous pouvez vérifier avant de la lire ainsi:
(defn str->int [str] (if (re-matches (re-pattern "\\d+") str) (read-string str)))
Je pense que je préfère la dernière solution.
Et maintenant, à votre question. Pour analyser quelque chose qui commence par un entier, comme 29px
:
(read-string (second (re-matches (re-pattern "(\\d+).*") "29px"))) ; => 29
Autant que je sache, il n'y a pas de solution standard pour votre problème. Je pense que quelque chose comme le suivant, qui utilise clojure.contrib.str-utils2/replace
, devrait aider:
(defn str2int [txt]
(Integer/parseInt (replace txt #"[a-zA-Z]" "")))
Ce n'est pas parfait, mais voici quelque chose avec filter
, Character/isDigit
et Integer/parseInt
. Il ne fonctionnera pas pour les nombres à virgule flottante et il échoue, si il n'y a pas de chiffres dans l'entrée, de sorte que vous devriez nettoyer. J'espère qu'il y a une jolie manière de faire qui n'implique pas autant de Java.
user=> (defn strToInt [x] (Integer/parseInt (apply str (filter #(Character/isDigit %) x))))
#'user/strToInt
user=> (strToInt "45px")
45
user=> (strToInt "45")
45
user=> (strToInt "a")
java.lang.NumberFormatException: For input string: "" (NO_SOURCE_FILE:0)