如何从localstorage中提取一个整数并使用clojurescript强制转换为整数

时间:2011-07-27 02:18:46

标签: clojure google-closure-library clojurescript

我正在尝试使用简单的clojurescript应用程序从localStorage中提取一个整数。我尝试的所有东西最终都尝试了某种错误的行为。

以下是我的程序,没有从本地存储初始化。我会忽略未找到密钥的情况,因为我有一个JQuery版本可以处理它来填充存储空间。此外,JQuery应用程序读取ClojureScript保存到localStorage很好。这对我有用。

快速摘要就是这样。我的消息说“自上次事件发生以来已有数天”,$ number位于一个名为“counter”的div中。我有三个按钮;一个递增计数,一个递减计数,最后一个将计数重置为零。

 (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)

当我尝试使用goog.math.Integer.fromString()强制转换为整数时,对inc的调用将在末尾追加1(7转到71和711)。对dec的调用将按照我的预期进行,数字递减(711转到710和709)。这是我试图初始化它的方式。

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

我意识到这是一个goog.math.Integer对象所以我试着在它上面调用.toNumber()。但是这和.toInt()似乎给了我一个功能。 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}确切地返回}}。

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

Clojure似乎使用java的Integer类从一个字符串转换为一个int,甚至到了(int“1”)抛出的点,这样才有了想法。

我也尝试调用javascript的parseInt()。这就是我在JQuery版本中的做法。但是,ClojureScript调用总是会返回1.即使我的JQuery版本存储了一个由Chrome的开发人员工具证明的8。

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

任何想法如何让字符串值表现为整数?它必须简单,但我无处可去。

3 个答案:

答案 0 :(得分:29)

您可以通过js名称空间访问parseInt函数,如下所示:

(js/parseInt "7")

答案 1 :(得分:1)

这是一个适用于Clojure和ClojureScript的方法:

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

(str->int "10")
> 10

答案 2 :(得分:0)

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

这不仅适用于整数,也适用于任何类型。