diff --git a/currency.module b/currency.module
index d4f4151..32e1a39 100644
--- a/currency.module
+++ b/currency.module
@@ -186,8 +186,9 @@ function currency_form_currency_amount_process(array $element, array &$form_stat
  * Implements form validate callback for a currency_amount element.
  */
 function currency_form_currency_amount_validate(array $element, array &$form_state) {
-  $amount = $element['#value']['amount'];
-  $currency_code = $element['#value']['currency_code'];
+  $value = $element['#value'];
+  $amount = $value['amount'];
+  $currency_code = $value['currency_code'];
 
   try {
     $amount = Input::parseAmount($amount);
@@ -213,6 +214,14 @@ function currency_form_currency_amount_validate(array $element, array &$form_sta
       '!amount' => $currency->format($element['#maximum_amount']),
     )));
   }
+
+  // The amount in $form_state is a human-readable, optionally localized
+  // string, which cannot be used by other code. $amount is a float after
+  // running it through Input::parseAmount().
+  form_set_value($element, array(
+    'amount' => $amount,
+    'currency_code' => $currency_code,
+  ), $form_state);
 }
 
 /**
diff --git a/currency_test/currency_test.module b/currency_test/currency_test.module
index f5e43cf..08f686a 100644
--- a/currency_test/currency_test.module
+++ b/currency_test/currency_test.module
@@ -49,4 +49,6 @@ function currency_test_form_currency_amount(array $form, array &$form_state) {
 function currency_test_form_submit(array $form, array &$form_state) {
   // Redirect, so we can test whether form errors were thrown.
   $form_state['redirect'] = 'user';
+  // Display the form element value, so we can test if it is processed.
+  drupal_set_message(var_export($form_state['values']['amount'], TRUE));
 }
diff --git a/tests/CurrencyAmountFormElementWebTestCase.test b/tests/CurrencyAmountFormElementWebTestCase.test
index 6d05623..b64d572 100644
--- a/tests/CurrencyAmountFormElementWebTestCase.test
+++ b/tests/CurrencyAmountFormElementWebTestCase.test
@@ -33,6 +33,10 @@ class CurrencyAmountFormElementWebTestCase extends DrupalWebTestCase {
     );
     $this->drupalPost($path, $values, t('Submit'));
     $this->assertUrl('user', array(), 'A valid value higher than an explicitely configured <em>#minimum_value</em> triggers form submission.');
+    $this->assertRaw(var_export(array(
+      'amount' => 50.95,
+      'currency_code' => 'EUR',
+    ), TRUE));
 
     // Test illegal characters.
     $values =  array(
