2012-05-25 54 views

Trả lời

2

Ví dụ này chuyển đổi một chuỗi số thành một số.

(defn String->Number [str] 
    (let [n (read-string str)] 
     (if (number? n) n nil))) 

mẫu:

user=> (String->Number "4.5") 
4.5 
user=> (str 4.5) 
"4.5" 
user=> (String->Number "abc") 
nil 
+0

@octopusgrabbus -Cảm ơn sự giúp đỡ của bạn. – BLUEPIXY

+11

Bạn có lẽ không nên sử dụng điều này trong cuộc sống thực. Từ các tài liệu, nó có thể thực thi mã tùy ý https://clojuredocs.org/clojure.core/read-string vốn là một lỗ hổng bảo mật rất lớn. Tôi nghĩ rằng 'bigdec' là một giải pháp tốt hơn. –

1

Từ câu hỏi của bạn, bạn dường như muốn có một chức năng chuyển đổi, đó là một trong đó có thể đọc trong một số và chuyển đổi thành một chuỗi và cũng đọc trong một chuỗi và trả lại một số, nếu chuỗi chứa các chữ số, như 123.0 hoặc "123.0".

Dưới đây là một ví dụ:

(defn cvt-str-num [val] 
    (if (try 
      (number? val) 
      (catch Exception e (str "Invalid number: " (.getMessage e)))) 
     (str val) 
     (let [n-val (read-string val)] 
      (if (number? n-val) 
       n-val 
       nil)))) 

Tôi không thể nhìn thấy một cách xung quanh let ràng buộc của n-val, bởi vì một vị trí tạm thời là cần thiết để lưu trữ giá trị trả về đọc chuỗi, vì vậy nó có thể được kiểm tra như một con số. Nếu nó là một số nó được trả về; khác nil được trả lại.

1

Lưu ý rằng read-string cung cấp cho bạn một số dấu chấm động, không phải là một số thập phân:

user=> (.getClass (read-string "1.01")) 
java.lang.Double 

Số bạn trở lại in như những gì bạn muốn nhưng nó không phải là, chính xác.

user=> (new BigDecimal (read-string "1.01")) 
1.0100000000000000088817841970012523233890533447265625M 

Bạn có thể sử dụng java.math.BigDecimal thay vào đó và tránh các biến chứng dấu chấm động:

user=> (new BigDecimal "1.01") 
1.01M 
user=> (.toString (new BigDecimal "1.01")) 
"1.01" 
+1

thử điều này (đọc chuỗi "1.01M") – BLUEPIXY

29

Có chức năng clojure rất thuận tiện để chuyển đổi từ bất cứ điều gì để chuỗi và từ một cái gì đó giống như một số để BigDecimal:

user=> (bigdec "1234") 
1234M 
user=> (str 1234M) 
"1234" 

Tôi đoán đây là cách kinh điển.

+3

Đây phải là câu trả lời được chấp nhận. – nha

Các vấn đề liên quan