Как мога да извадя цяло число от localstorage и да принудя към цяло число с помощта на 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() изглежда ми дадоха функция. функция (){if(this.e==-1)return-w(this).D();else{for(var a=0,b=1,d=0;d=0?e:Ua+ д)b;b=Ua}върни a}}, за да бъдем точни.

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

Clojure изглежда използва Integer класа на Java за прехвърляне от низ към int дори до точката на (int "1") хвърляне, така че тази идея беше заснета.

Също така се опитах да извикам parseInt() на javascript. Ето как го правя във версията на 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
Защо се обаждате на str on 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