ICU-20954 Fix currency spacing in suffix.
diff --git a/icu4c/source/i18n/number_modifiers.cpp b/icu4c/source/i18n/number_modifiers.cpp
index 1267f6a..3becb7b 100644
--- a/icu4c/source/i18n/number_modifiers.cpp
+++ b/icu4c/source/i18n/number_modifiers.cpp
@@ -358,7 +358,7 @@
         fAfterPrefixInsert.setToBogus();
     }
     if (suffix.length() > 0 && suffix.fieldAt(0) == Field(UFIELD_CATEGORY_NUMBER, UNUM_CURRENCY_FIELD)) {
-        int suffixCp = suffix.getLastCodePoint();
+        int suffixCp = suffix.getFirstCodePoint();
         UnicodeSet suffixUnicodeSet = getUnicodeSet(symbols, IN_CURRENCY, SUFFIX, status);
         if (suffixUnicodeSet.contains(suffixCp)) {
             fBeforeSuffixUnicodeSet = getUnicodeSet(symbols, IN_NUMBER, SUFFIX, status);
diff --git a/icu4c/source/test/intltest/numbertest.h b/icu4c/source/test/intltest/numbertest.h
index bf4aa77..30615b9 100644
--- a/icu4c/source/test/intltest/numbertest.h
+++ b/icu4c/source/test/intltest/numbertest.h
@@ -95,6 +95,7 @@
     CurrencyUnit ESP;
     CurrencyUnit PTE;
     CurrencyUnit RON;
+    CurrencyUnit CNY;
 
     MeasureUnit METER;
     MeasureUnit DAY;
diff --git a/icu4c/source/test/intltest/numbertest_api.cpp b/icu4c/source/test/intltest/numbertest_api.cpp
index ba3b927..50ff2ab 100644
--- a/icu4c/source/test/intltest/numbertest_api.cpp
+++ b/icu4c/source/test/intltest/numbertest_api.cpp
@@ -33,6 +33,7 @@
           ESP(u"ESP", status),
           PTE(u"PTE", status),
           RON(u"RON", status),
+          CNY(u"CNY", status),
           FRENCH_SYMBOLS(Locale::getFrench(), status),
           SWISS_SYMBOLS(Locale("de-CH"), status),
           MYANMAR_SYMBOLS(Locale("my"), status) {
@@ -893,6 +894,15 @@
             Locale("ro-RO"),
             24,
             u"24,00 lei românești");
+
+    assertFormatSingle(
+            u"Currency spacing in suffix (ICU-20954)",
+            u"currency/CNY",
+            u"currency/CNY",
+            NumberFormatter::with().unit(CNY),
+            Locale("lu"),
+            123.12,
+            u"123,12 CN¥");
 }
 
 void NumberFormatterApiTest::unitPercent() {
diff --git a/icu4c/source/test/testdata/numberpermutationtest.txt b/icu4c/source/test/testdata/numberpermutationtest.txt
index 4b4656e..24136ad 100644
--- a/icu4c/source/test/testdata/numberpermutationtest.txt
+++ b/icu4c/source/test/testdata/numberpermutationtest.txt
@@ -951,7 +951,7 @@
   bn-BD
     ০€
     +৯২ হা€
-    (০.২২ €)
+    (০.২২€)
 
 compact-short measure-unit/length-furlong sign-accounting-except-zero
   es-MX
@@ -993,7 +993,7 @@
   bn-BD
     ০.০০E+০০€
     +৯.১৮E+০৪€
-    (২.২২E-০১ €)
+    (২.২২E-০১€)
 
 scientific/+ee/sign-always measure-unit/length-furlong sign-accounting-except-zero
   es-MX
@@ -3877,7 +3877,7 @@
   bn-BD
     ০.০০€
     +৯১,৮২৭.৩৬€
-    (০.২২ €)
+    (০.২২€)
 
 currency/EUR unit-width-full-name sign-accounting-except-zero
   es-MX
@@ -4927,7 +4927,7 @@
   bn-BD
     ০.০০০€
     +৯১,৮২৭.৩৬৪€
-    (০.২২২ €)
+    (০.২২২€)
 
 currency/EUR .##/@@@+ sign-accounting-except-zero
   es-MX
@@ -4941,7 +4941,7 @@
   bn-BD
     ০€
     +৯১,৮২৭.৩৬€
-    (০.২২২ €)
+    (০.২২২€)
 
 currency/EUR @@ sign-accounting-except-zero
   es-MX
@@ -4955,7 +4955,7 @@
   bn-BD
     ০.০€
     +৯২,০০০€
-    (০.২২ €)
+    (০.২২€)
 
 measure-unit/length-furlong precision-integer sign-accounting-except-zero
   es-MX
@@ -5375,7 +5375,7 @@
   bn-BD
     ০.০০€
     +৯১,৮২৭.৩৬€
-    (০.২৩ €)
+    (০.২৩€)
 
 measure-unit/length-furlong rounding-mode-floor sign-accounting-except-zero
   es-MX
@@ -5585,7 +5585,7 @@
   bn-BD
     ০০.০০€
     +১,৮২৭.৩৬€
-    (০০.২২ €)
+    (০০.২২€)
 
 measure-unit/length-furlong integer-width/##00 sign-accounting-except-zero
   es-MX
@@ -5753,7 +5753,7 @@
   bn-BD
     ০.০০€
     +৪৫,৯১৩.৬৮€
-    (০.১১ €)
+    (০.১১€)
 
 measure-unit/length-furlong scale/0.5 sign-accounting-except-zero
   es-MX
@@ -5879,7 +5879,7 @@
   bn-BD
     ০.০০€
     +৯১,৮২৭.৩৬€
-    (০.২২ €)
+    (০.২২€)
 
 measure-unit/length-furlong group-on-aligned sign-accounting-except-zero
   es-MX
@@ -5963,7 +5963,7 @@
   bn-BD
     0.00€
     +91,827.36€
-    (0.22 €)
+    (0.22€)
 
 measure-unit/length-furlong latin sign-accounting-except-zero
   es-MX
@@ -6047,7 +6047,7 @@
   bn-BD
     ০.০০€
     +৯১,৮২৭.৩৬€
-    (০.২২ €)
+    (০.২২€)
 
 measure-unit/length-furlong sign-accounting-except-zero decimal-always
   es-MX
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CurrencySpacingEnabledModifier.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CurrencySpacingEnabledModifier.java
index 6664645..50a812f 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CurrencySpacingEnabledModifier.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/number/CurrencySpacingEnabledModifier.java
@@ -54,7 +54,7 @@
             afterPrefixInsert = null;
         }
         if (suffix.length() > 0 && suffix.fieldAt(0) == NumberFormat.Field.CURRENCY) {
-            int suffixCp = suffix.getLastCodePoint();
+            int suffixCp = suffix.getFirstCodePoint();
             UnicodeSet suffixUnicodeSet = getUnicodeSet(symbols, IN_CURRENCY, SUFFIX);
             if (suffixUnicodeSet.contains(suffixCp)) {
                 beforeSuffixUnicodeSet = getUnicodeSet(symbols, IN_NUMBER, SUFFIX);
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberpermutationtest.txt b/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberpermutationtest.txt
index 4b4656e..24136ad 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberpermutationtest.txt
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/data/numberpermutationtest.txt
@@ -951,7 +951,7 @@
   bn-BD
     ০€
     +৯২ হা€
-    (০.২২ €)
+    (০.২২€)
 
 compact-short measure-unit/length-furlong sign-accounting-except-zero
   es-MX
@@ -993,7 +993,7 @@
   bn-BD
     ০.০০E+০০€
     +৯.১৮E+০৪€
-    (২.২২E-০১ €)
+    (২.২২E-০১€)
 
 scientific/+ee/sign-always measure-unit/length-furlong sign-accounting-except-zero
   es-MX
@@ -3877,7 +3877,7 @@
   bn-BD
     ০.০০€
     +৯১,৮২৭.৩৬€
-    (০.২২ €)
+    (০.২২€)
 
 currency/EUR unit-width-full-name sign-accounting-except-zero
   es-MX
@@ -4927,7 +4927,7 @@
   bn-BD
     ০.০০০€
     +৯১,৮২৭.৩৬৪€
-    (০.২২২ €)
+    (০.২২২€)
 
 currency/EUR .##/@@@+ sign-accounting-except-zero
   es-MX
@@ -4941,7 +4941,7 @@
   bn-BD
     ০€
     +৯১,৮২৭.৩৬€
-    (০.২২২ €)
+    (০.২২২€)
 
 currency/EUR @@ sign-accounting-except-zero
   es-MX
@@ -4955,7 +4955,7 @@
   bn-BD
     ০.০€
     +৯২,০০০€
-    (০.২২ €)
+    (০.২২€)
 
 measure-unit/length-furlong precision-integer sign-accounting-except-zero
   es-MX
@@ -5375,7 +5375,7 @@
   bn-BD
     ০.০০€
     +৯১,৮২৭.৩৬€
-    (০.২৩ €)
+    (০.২৩€)
 
 measure-unit/length-furlong rounding-mode-floor sign-accounting-except-zero
   es-MX
@@ -5585,7 +5585,7 @@
   bn-BD
     ০০.০০€
     +১,৮২৭.৩৬€
-    (০০.২২ €)
+    (০০.২২€)
 
 measure-unit/length-furlong integer-width/##00 sign-accounting-except-zero
   es-MX
@@ -5753,7 +5753,7 @@
   bn-BD
     ০.০০€
     +৪৫,৯১৩.৬৮€
-    (০.১১ €)
+    (০.১১€)
 
 measure-unit/length-furlong scale/0.5 sign-accounting-except-zero
   es-MX
@@ -5879,7 +5879,7 @@
   bn-BD
     ০.০০€
     +৯১,৮২৭.৩৬€
-    (০.২২ €)
+    (০.২২€)
 
 measure-unit/length-furlong group-on-aligned sign-accounting-except-zero
   es-MX
@@ -5963,7 +5963,7 @@
   bn-BD
     0.00€
     +91,827.36€
-    (0.22 €)
+    (0.22€)
 
 measure-unit/length-furlong latin sign-accounting-except-zero
   es-MX
@@ -6047,7 +6047,7 @@
   bn-BD
     ০.০০€
     +৯১,৮২৭.৩৬€
-    (০.২২ €)
+    (০.২২€)
 
 measure-unit/length-furlong sign-accounting-except-zero decimal-always
   es-MX
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java
index 47000e6..fbe86f8 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/number/NumberFormatterApiTest.java
@@ -66,6 +66,7 @@
     private static final Currency ESP = Currency.getInstance("ESP");
     private static final Currency PTE = Currency.getInstance("PTE");
     private static final Currency RON = Currency.getInstance("RON");
+    private static final Currency CNY = Currency.getInstance("CNY");
 
     @Test
     public void notationSimple() {
@@ -864,6 +865,15 @@
                 ULocale.forLanguageTag("ro-RO"),
                 24,
                 "24,00 lei românești");
+
+        assertFormatSingle(
+                "Currency spacing in suffix (ICU-20954)",
+                "currency/CNY",
+                "currency/CNY",
+                NumberFormatter.with().unit(CNY),
+                ULocale.forLanguageTag("lu"),
+                123.12,
+                "123,12 CN¥");
     }
 
     @Test