(ns auto-ap.parse.util (:require [clj-time.core :as time] [clj-time.format :as f] [clojure.string :as str] [clojure.tools.logging :as log])) (defmulti parse-value (fn [method _ _] method)) (defmethod parse-value :trim-commas [_ _ value] (str/replace value #"," "") ) (defmethod parse-value :trim-commas-and-remove-dollars [_ _ value] (str/replace (str/replace value #"," "") #"\$" "")) (defmethod parse-value :trim-commas-and-remove-dollars-and-invert-parentheses [_ _ value] (let [v (str/replace (str/replace value #"," "") #"\$" "")] (if-let [[_ a ] (re-find #"\((.*)\)" v)] (str "-" a) v))) (defmethod parse-value :trim-commas-and-negate [_ _ value] (let [[_ raw-value] (re-find #"([\d\.]+)" (-> value (str/replace #"," "") (str/replace #"-" "")))] (if (or (str/includes? value "-") (str/includes? value "CR")) (str (- (Double/parseDouble raw-value))) (str raw-value)))) (defmethod parse-value :clj-time [_ format value] (let [format (if (sequential? format) format [format])] (reduce (fn [_ format] (try (reduced (time/from-time-zone (f/parse (f/formatter format) value) (time/time-zone-for-id "America/Los_Angeles"))) (catch Exception e (log/warn e) nil))) nil format) )) (defmethod parse-value nil [_ _ value] value)