diff --git a/Rules/Languages/de/SharedRules/general.yaml b/Rules/Languages/de/SharedRules/general.yaml
index a5792c745..4c0f252fb 100644
--- a/Rules/Languages/de/SharedRules/general.yaml
+++ b/Rules/Languages/de/SharedRules/general.yaml
@@ -317,7 +317,23 @@
then: [x: "concat('\uF8FE', DefinitionValue($Word, 'Speech', 'PluralForms'))", ct: " "]
else: [x: "concat('\uF8FE', $Word)", ct: "s"]
-
+# Currency symbols precede amounts in MathML but are spoken after them in German: $ 3 -> 3 dollar.
+- name: currency
+ tag: mrow
+ match: "count(*)=3 and DefinitionValue(*[1], 'Speech', 'CurrencySymbols') != ''"
+ variables:
+ - IsSingular: "*[3][self::m:mn and .=1] and *[2]='\u2062'"
+ - CurrencyWord: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')"
+ replace:
+ - bookmark: "*[3]/@id"
+ - x: "*[3]"
+ - test:
+ - if: "$IsSingular"
+ then: [x: "$CurrencyWord"]
+ - else_if: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms') != ''"
+ then: [x: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms')"]
+ else: [x: "$CurrencyWord"]
+
- name: sin
tag: mi
match: ".='sin'"
diff --git a/tests/Languages/de/units.rs b/tests/Languages/de/units.rs
index fffd6ac5a..605ac2ed1 100644
--- a/tests/Languages/de/units.rs
+++ b/tests/Languages/de/units.rs
@@ -103,6 +103,23 @@ fn non_si_unit_plural_regression() -> Result<()> {
Ok(())
}
+#[test]
+fn currency_symbol_precedes_amount() -> Result<()> {
+ // German speaks a prefixed currency symbol after its amount.
+ let expr = r#""#;
+ test("de", "ClearSpeak", expr, "3 dollar")?;
+ test("de", "SimpleSpeak", expr, "3 dollar")?;
+
+ let expr = r#""#;
+ test("de", "ClearSpeak", expr, "1 euro")?;
+ test("de", "SimpleSpeak", expr, "1 euro")?;
+
+ let expr = r#""#;
+ test("de", "ClearSpeak", expr, "4,7 pfund")?;
+ test("de", "SimpleSpeak", expr, "4,7 pfund")?;
+ Ok(())
+}
+
/*
#[test]
fn si_base_with_prefixes() -> Result<()> {