diff --git a/src/QBar/Blocks.hs b/src/QBar/Blocks.hs
index 04ce46ec2a1d083c22b3d838493159153569901a..cedacdb842cff8332a245aa46460ee0c2a61a8c4 100644
--- a/src/QBar/Blocks.hs
+++ b/src/QBar/Blocks.hs
@@ -1,8 +1,8 @@
-module QBar.Blocks (
-  module QBar.Blocks.Battery,
-  module QBar.Blocks.Date
-) where
+module QBar.Blocks
+  ( QBar.Blocks.Battery.batteryBlock,
+    QBar.Blocks.Date.dateBlock,
+  )
+where
 
-
-import QBar.Blocks.Battery
-import QBar.Blocks.Date
+import qualified QBar.Blocks.Battery
+import qualified QBar.Blocks.Date
diff --git a/src/QBar/Blocks/Battery.hs b/src/QBar/Blocks/Battery.hs
index 9bef2f65189ef5fc4857768384ff0d039b6cce1d..cfa9f28ca0486af63abbea8e35d12215bb77d992 100644
--- a/src/QBar/Blocks/Battery.hs
+++ b/src/QBar/Blocks/Battery.hs
@@ -4,7 +4,8 @@
 module QBar.Blocks.Battery where
 
 
-import QBar.Core hiding (name)
+import QBar.Core
+import QBar.Blocks.Utils
 import QBar.BlockOutput
 import Pipes
 
@@ -12,18 +13,12 @@ import qualified Data.Text.Lazy as T
 import qualified Data.Text.Lazy.IO as TIO
 
 import System.Directory
-import Control.Exception (catch, IOException)
 import Data.Maybe
 import Text.Read (readMaybe)
-import Numeric (showFFloat)
 
 import Control.Lens
 
 
-formatFloatN :: RealFloat a => Int -> a -> T.Text
-formatFloatN n f = T.pack $ showFFloat (Just n) f ""
-
-
 data BatteryStatus = BatteryCharging | BatteryDischarging | BatteryOther
   deriving (Show)
 
@@ -36,10 +31,6 @@ data BatteryState = BatteryState
 } deriving (Show)
 
 
-tryMaybe :: IO a -> IO (Maybe a)
-tryMaybe a = catch (Just <$> a) (\ (_ :: IOException) -> return Nothing)
-
-
 getBatteryState :: FilePath -> IO (Maybe BatteryState)
 getBatteryState path = tryMaybe $ do
   status' <- TIO.readFile (path <> "/status")
diff --git a/src/QBar/Blocks/Utils.hs b/src/QBar/Blocks/Utils.hs
new file mode 100644
index 0000000000000000000000000000000000000000..17b759a98dae3608b1c27376555887cfeb6af8dc
--- /dev/null
+++ b/src/QBar/Blocks/Utils.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module QBar.Blocks.Utils where
+
+import Control.Exception (IOException, catch)
+import qualified Data.Attoparsec.Text.Lazy as AT
+import qualified Data.Text.Lazy as T
+import qualified Data.Text.Lazy.IO as TIO
+import Numeric (showFFloat)
+
+formatFloatN :: RealFloat a => Int -> a -> T.Text
+formatFloatN = formatFloatN' 0
+
+formatFloatN' :: RealFloat a => Int -> Int -> a -> T.Text
+formatFloatN' padWithZeros decimalPlaces f = T.justifyRight (fromIntegral padWithZeros) '0' . T.pack $ showFFloat (Just decimalPlaces) f ""
+
+tryMaybe :: IO a -> IO (Maybe a)
+tryMaybe a = tryMaybe' (Just <$> a)
+
+tryMaybe' :: IO (Maybe a) -> IO (Maybe a)
+tryMaybe' a = catch a (\(_ :: IOException) -> return Nothing)
+
+parseFile :: FilePath -> AT.Parser a -> IO (Maybe a)
+parseFile path parser = tryMaybe' $ do
+  fileContents <- TIO.readFile path
+  return . AT.maybeResult $ AT.parse parser fileContents