2012-05-25 19 views

Respuesta

2

Este ejemplo convierte una cadena numérica en un número.

(defn String->Number [str] 
    (let [n (read-string str)] 
     (if (number? n) n nil))) 

muestra:

user=> (String->Number "4.5") 
4.5 
user=> (str 4.5) 
"4.5" 
user=> (String->Number "abc") 
nil 
+0

@octopusgrabbus -Gracias por su ayuda. – BLUEPIXY

+11

Probablemente no deberías usar esto en la vida real. Desde los documentos, puede ejecutar código arbitrario https://clojuredocs.org/clojure.core/read-string, que es una gran vulnerabilidad de seguridad. Creo que 'bigdec' es una mejor solución. –

1

Desde su pregunta, que parecen querer una función de activación, que es uno que puede leer en un número y convertirlo en una cadena y también leído en una cadena y vuelta un número, si la cadena contiene dígitos numéricos, como 123.0 o "123.0".

Aquí se muestra un ejemplo:

(defn cvt-str-num [val] 
    (if (try 
      (number? val) 
      (catch Exception e (str "Invalid number: " (.getMessage e)))) 
     (str val) 
     (let [n-val (read-string val)] 
      (if (number? n-val) 
       n-val 
       nil)))) 

no podía ver una forma de evitar la unión de n-val let, ya que un lugar provisional se necesita para almacenar el valor de retorno de lectura cadena, por lo que podría ponerse a prueba como un número. Si es un número, se devuelve; else nil es devuelto.

1

Tenga en cuenta que read-string le da un número de coma flotante, no es un decimal:

user=> (.getClass (read-string "1.01")) 
java.lang.Double 

El número que se obtiene de la parte posterior, como lo desea, pero no es, exactamente.

user=> (new BigDecimal (read-string "1.01")) 
1.0100000000000000088817841970012523233890533447265625M 

Puede utilizar java.math.BigDecimal lugar y evitar complicaciones de punto flotante:

user=> (new BigDecimal "1.01") 
1.01M 
user=> (.toString (new BigDecimal "1.01")) 
"1.01" 
+1

intente esto (cadena de lectura "1.01M") – BLUEPIXY

29

Hay funciones clojure muy convenientes para convertir de cualquier cosa a cuerda y de algo parecido a un número de BigDecimal:

user=> (bigdec "1234") 
1234M 
user=> (str 1234M) 
"1234" 

Supongo que esta es la manera canónica de Clojure.

+3

Esta debería ser la respuesta aceptada. – nha

Cuestiones relacionadas