2011-07-27 10 views
9

Estoy tratando de extraer un entero de localStorage con una aplicación simple de clojurescript. Todo lo que he probado ha resultado tener algún tipo de comportamiento incorrecto.¿Cómo puedo extraer un número entero del almacén local y forzar a un número entero usando clojurescript

A continuación se muestra mi programa sin inicializar desde el almacenamiento local. Ignoraré el caso clave no encontrada ya que tengo una versión de JQuery que maneja eso para preparar el almacenamiento. Además, la aplicación JQuery lee ClojureScript guarda en fine localStorage. Así que eso está funcionando para mí.

Resumen rápido es esto. El mensaje dice "Han pasado $ días desde el último incidente" El número $ está en un div llamado "contador". Tengo tres botones; uno incrementa el recuento, uno disminuye el recuento y el último restablece el recuento a cero.

(ns days.core 
     (:require [goog.events :as events] 
        [goog.string :as string] 
        [goog.math.Integer :as int] 
        [goog.dom :as dom])) 
    (defn initial-state [] 0) 
    (def count (atom (initial-state))) 
    (defn set-counter [n] 
     (do (.setItem (.localStorage (dom/getWindow)) "count" n) 
      (dom/setTextContent (dom/getElement "counter") n))) 
    (defn set-button-fn [button-id f-update] 
     (events/listen (dom/getElement button-id) 
         "click" 
         (fn [] (do (f-update) (set-counter @count))))) 
    (defn start-app [] 
     (do 
      (set-counter @count) 
      (set-button-fn "addDay" (fn [] (swap! count inc))) 
      (set-button-fn "decDay" (fn [] (swap! count dec))) 
      (set-button-fn "reset" (fn [] (reset! count 0))))) 
    (start-app) 

Cuando intento utilizar goog.math.Integer.fromString() para enviar contenido a un número entero, la llamada a inc añadirá un 1 en el extremo (7 fueron a 71 y 711). La llamada a desc hará lo que espero, lo disminuirá numéricamente (711 pasó a 710 y 709). Así es como estoy tratando de inicializar eso.

(defn initial-state [] 
    (integer/fromString (.getItem (.localStorage (dom/getWindow)) "count"))) 

me di cuenta que era un objeto goog.math.Integer así que traté de llamar .toNumber() sobre ella. Pero esto y .toInt() parecían darme una función. function() {if (this.e == - 1) return-w (this) .D(); else {for (var a = 0, b = 1, d = 0; d = 0? e: Ua + e) b; b = Ua} return a}} para ser exactos.

(defn initial-state [] (.toNumber 
    (integer/fromString (.getItem (.localStorage (dom/getWindow)) "count")))) 

Clojure parece utilizar la clase de enteros de java para emitir desde una cadena a un entero, incluso hasta el punto de tener (int "1") de manera que tirar idea recibió un disparo.

También traté de llamar al parseInt de JavaScript(). Así es como lo hago en la versión de JQuery. Sin embargo, la llamada ClojureScript siempre devuelve un 1. Incluso si mi versión de JQuery almacena un 8 como lo demuestran las herramientas de desarrollo de Chrome.

(defn initial-state [] 
    (.parseInt (dom/getWindow) 
      (.getItem (.localStorage (dom/getWindow)) "count"))) 

¿Alguna idea de cómo puedo hacer que ese valor de cadena se comporte como un número entero? Tiene que ser simple, pero no estoy llegando a ninguna parte.

Respuesta

27

Se puede acceder a la función parseInt a través del espacio de nombres js así:

(js/parseInt "7") 
+1

Por qué llamar str en "7"? – Pablo

+0

No hay una buena razón; He editado la respuesta para eliminarlo. –

0

La forma ClojureScript:

(ns reader-test.core 
    (:require [cljs.reader :as reader])) 

(reader/read-string "7") ;; 7 - integer 
(reader/read-string "1.3") ;; 1.3 - non-integer number 

Esto funciona no sólo para los números enteros, pero para cualquier tipo.

+0

Asegúrese de no utilizar 'read-string' para datos no confiables: https://groups.google.com/forum/#!topic/clojure/YBkUaIaRaow – bmaddy

+0

Gracias por notarlo. – akond

1

Aquí es un método que funciona tanto en Clojure y ClojureScript:

(defn- str->int [s] 
    #?(:clj (Integer/parseInt s) 
    :cljs (js/parseInt s))) 

(str->int "10") 
> 10 
Cuestiones relacionadas