Как я могу вытащить целое число из локального хранилища и привести к целому числу с помощью clojurescript

Я пытаюсь вытащить целое число из localStorage с помощью простого приложения clojurescript. Все, что я пробовал, в конечном итоге имело какое-то неправильное поведение.

Ниже моя программа без инициализации из локального хранилища. Я проигнорирую случай, когда ключ не найден, так как у меня есть версия JQuery, которая обрабатывает это, чтобы заполнить хранилище. Кроме того, приложение JQuery отлично читает сохранение ClojureScript в localStorage. Так что это работает для меня.

Краткое резюме таково. В сообщении говорится: «С момента последнего инцидента прошло $number дней». $number находится в div с именем «counter». У меня есть три кнопки; один увеличивает счетчик, один уменьшает счетчик, а последний сбрасывает счетчик до нуля.

 (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}вернуть a}}, чтобы быть точным.

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

Похоже, что Clojure использует класс java Integer для приведения из строки к int даже до точки (int "1") throw, так что эта идея была снята.

Я также пытался вызвать javascript parseInt(). Вот как я это делаю в версии JQuery. Однако вызов ClojureScript всегда возвращает 1. Даже если моя версия JQuery хранит 8, о чем свидетельствуют инструменты разработчика Chrome.

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

Любые идеи, как я могу заставить это строковое значение вести себя как целое число? Это должно быть просто, но я никуда не денусь.


person Ball    schedule 27.07.2011    source источник


Ответы (3)


Вы можете получить доступ к функции parseInt через пространство имен js следующим образом:

(js/parseInt "7")
person Daniel Thompson    schedule 28.07.2011
comment
Зачем звонить ул на 7? - person pupeno; 03.10.2015
comment
Я наткнулся на этот ответ и поиграл с ним. Я понял, что (js/parseInt "7abc") также возвращает 7. Адский JavaScript, зачем ты это делаешь? ... - person n2o; 06.07.2018
comment
Хороший улов, для меня такое поведение хорошо большую часть времени. Когда я не использую (defn str->int [s] (when (= s (str (js/parseInt s))) (js/parseInt s))) или (defn str->int [s] (if (= s (str (js/parseInt s))) (js/parseInt s) s)) - person Jp_; 20.05.2020

Вот метод, который работает как в Clojure, так и в ClojureScript:

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

(str->int "10")
> 10
person bmaddy    schedule 08.03.2017

Способ 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

Это работает не только для целых чисел, но и для любого типа.

person akond    schedule 23.01.2017
comment
Не используйте read-string для ненадежных данных: groups.google.com/forum/ #!topic/clojure/YBkUaIaRaow - person bmaddy; 08.03.2017