147 votes

En Clojure comment puis-je convertir une Chaîne en nombre?

J'ai plusieurs cordes, certains comme "45", certains, comme "45px". Comment je convertir à la fois de celles-ci au nombre de 45?

89voto

snrobot Points 331

Ce sera le travail sur 10px ou px10

(defn parse-int [s]
   (Integer. (re-find  #"\d+" s )))

il analyse la première continue des chiffres uniquement

user=> (parse-int "10not123")
10
user=> (parse-int "abc10def11")
10

86voto

bat Points 5380

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

31voto

MayDaniel Points 1226
(defn parse-int [s]
  (Integer. (re-find #"[0-9]*" s)))

user> (parse-int "10px")
10
user> (parse-int "10")
10

10voto

skuro Points 9235

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]" "")))

8voto

spacemanaki Points 4485

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X