2011-07-27 19 views
9

Tôi đang cố kéo một số nguyên ra khỏi localStorage bằng một ứng dụng clojurescript đơn giản. Tất cả mọi thứ tôi đã cố gắng kết thúc cố gắng có một số loại hành vi sai trái.Làm thế nào tôi có thể kéo một số nguyên ra khỏi localstorage và ép buộc đến một số nguyên bằng cách sử dụng clojurescript

Dưới đây là chương trình của tôi mà không khởi tạo từ bộ nhớ cục bộ. Tôi sẽ bỏ qua trường hợp không tìm thấy khóa vì tôi đã có phiên bản JQuery xử lý việc đó để lưu trữ chính. Ngoài ra, ứng dụng JQuery đọc ClojureScript lưu vào localStorage. Vì vậy, đó là làm việc cho tôi.

Tóm tắt nhanh là điều này. Tôi thông báo rằng "Đã có $ number ngày kể từ lần xảy ra sự cố cuối cùng" Số $ nằm trong div có tên "counter". Tôi có ba nút; một gia số đếm, một giảm số đếm, và số cuối cùng đặt lại số đếm bằng không.

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

Khi tôi cố gắng sử dụng goog.math.Integer.fromString() để đúc thành một số nguyên, các cuộc gọi đến inc sẽ nối 1 ở cuối dòng (7 đến 71 và 711). Cuộc gọi đến tháng mười hai sẽ làm những gì tôi mong đợi, giảm số lượng (711 đã đi đến 710 và 709). Đây là cách tôi đang cố gắng khởi tạo điều đó.

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

tôi nhận ra đây là một đối tượng goog.math.Integer vì vậy tôi cố gắng gọi .toNumber() trên đó. Nhưng điều này và .toInt() dường như cho tôi một chức năng. 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} trả về a}} chính xác.

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

Clojure dường như sử dụng lớp Integer của java để truyền từ chuỗi đến int ngay cả khi có (int "1") ném sao cho ý tưởng được chụp.

Tôi cũng đã cố gọi hàm parseInt() của javascript. Đây là cách tôi làm điều đó trong phiên bản JQuery. Tuy nhiên, cuộc gọi ClojureScript luôn trả về 1. Ngay cả khi phiên bản JQuery của tôi lưu trữ một 8 bằng chứng là các công cụ dành cho nhà phát triển của Chrome.

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

Bất kỳ ý tưởng nào để tôi có thể nhận giá trị chuỗi đó hoạt động như một số nguyên? Nó phải đơn giản, nhưng tôi không đi đâu cả.

Trả lời

27

Bạn có thể truy cập vào các chức năng parseInt qua namespace js như sau:

(js/parseInt "7") 
+1

Tại sao gọi str trên "7"? – Pablo

+0

Không có lý do chính đáng; Tôi đã chỉnh sửa câu trả lời để xóa nó. –

0

Các ClojureScript cách:

(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 

này hoạt động không chỉ đối với số nguyên, nhưng đối với bất kỳ loại.

+0

Đảm bảo không sử dụng 'chuỗi đọc 'cho dữ liệu không đáng tin cậy: https://groups.google.com/forum/#!topic/clojure/YBkUaIaRaow – bmaddy

+0

Cảm ơn bạn đã chú ý. – akond

1

Dưới đây là một phương pháp mà làm việc trong cả hai Clojure và ClojureScript:

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

(str->int "10") 
> 10