diff --git a/CHANGELOG.md b/CHANGELOG.md
index 284b31e..615d9f2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,13 +1,6 @@
-## 0.17.0-nullsafety.2
+## 0.17.1-dev
 
-* Update SDK constraints to >=2.12.0-0 <3.0.0 based on beta release guidelines.
-
-## 0.17.0-nullsafety.1
-
-* Allow prereleases of the 2.12 Dart SDK.
-
-## 0.17.0-nullsafety
-
+## 0.17.0
  * Migrate to null safety.
  * Add `@pragma('vm:prefer-inline')` to `Intl` methods that already have
    `@pragma('dart2js:tryInline')`, for the same reason: to help omit message
diff --git a/LICENSE b/LICENSE
index ab3bfa0..7efe25f 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright 2013, the Dart project authors. 
+Copyright 2013, the Dart project authors.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
diff --git a/lib/date_time_patterns.dart b/lib/date_time_patterns.dart
index 162dc20..af734be 100644
--- a/lib/date_time_patterns.dart
+++ b/lib/date_time_patterns.dart
@@ -16,7 +16,7 @@
 /// Returns a Map from locale names to another Map that goes from skeletons
 /// to the locale-specific formatting patterns.
 /// Internal use only. Call initializeDateFormatting instead.
-Map<String, Map<String, String>> dateTimePatternMap() => const {
+Map<String, Map<String, String>> dateTimePatternMap() => {
       /// Extended set of localized date/time patterns for locale af.
       'af': const {
         'd': 'd', // DAY
diff --git a/lib/src/intl/number_format.dart b/lib/src/intl/number_format.dart
index 9a3a8f2..85c1b05 100644
--- a/lib/src/intl/number_format.dart
+++ b/lib/src/intl/number_format.dart
@@ -364,18 +364,24 @@
 
   /// A number format for compact representations, e.g. "1.2M" instead
   /// of "1,200,000".
-  factory NumberFormat.compact({String? locale}) {
+  factory NumberFormat.compact({String? locale, String? pattern}) {
     return _CompactNumberFormat(
         locale: locale,
-        formatType: _CompactFormatType.COMPACT_DECIMAL_SHORT_PATTERN);
+        formatType: _CompactFormatType.COMPACT_DECIMAL_SHORT_PATTERN,
+        getPattern: pattern != null
+            ? (x) => pattern
+            : _CompactNumberFormat._forDecimal);
   }
 
   /// A number format for "long" compact representations, e.g. "1.2 million"
-  /// instead of of "1,200,000".
-  factory NumberFormat.compactLong({String? locale}) {
+  /// instead of "1,200,000".
+  factory NumberFormat.compactLong({String? locale, String? pattern}) {
     return _CompactNumberFormat(
         locale: locale,
-        formatType: _CompactFormatType.COMPACT_DECIMAL_LONG_PATTERN);
+        formatType: _CompactFormatType.COMPACT_DECIMAL_LONG_PATTERN,
+        getPattern: pattern != null
+            ? (x) => pattern
+            : _CompactNumberFormat._forDecimal);
   }
 
   /// A number format for compact currency representations, e.g. "$1.2M" instead
diff --git a/pubspec.yaml b/pubspec.yaml
index 6e8de71..870f832 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: intl
-version: 0.17.0-nullsafety.2
+version: 0.17.1-dev
 homepage: https://github.com/dart-lang/intl
 description: >-
   Contains code to deal with internationalized/localized messages, date and
@@ -10,11 +10,11 @@
   sdk: '>=2.12.0-0 <3.0.0'
 
 dependencies:
-  clock: ^1.1.0-nullsafety.1
-  path: ^1.8.0-nullsafety.1
+  clock: ^1.1.0
+  path: ^1.8.0
 
 dev_dependencies:
-  ffi: ^0.2.0-nullsafety.1
-  fixnum: ^1.0.0-nullsafety.0
-  js: ^0.6.3-nullsafety
-  test: ^1.16.0-nullsafety.4
+  ffi: ^1.0.0
+  fixnum: ^1.0.0
+  js: ^0.6.3
+  test: ^1.16.0
diff --git a/test/number_format_compact_icu_test.dart b/test/number_format_compact_icu_test.dart
index b48f91c..5cb1255 100644
--- a/test/number_format_compact_icu_test.dart
+++ b/test/number_format_compact_icu_test.dart
@@ -16,58 +16,62 @@
 import 'more_compact_number_test_data.dart' as more_testdata;
 
 main() {
-  var problemLocales = [
+  var problemLocales = {
     // ICU produces numerals in Arabic script, package:intl uses Latin script.
     'ar',
     // package:intl includes some tweaks to compact numbers for Bengali.
     'bn',
-  ];
-
+  };
   runICUTests(systemIcuVersion: 63, skipLocales: problemLocales);
 }
 
 void runICUTests(
-    {int? systemIcuVersion, String? specialIcuLib, List<String>? skipLocales}) {
-  if (!setupICU(
+    {int? systemIcuVersion,
+    String? specialIcuLib,
+    Set<String> skipLocales = const {}}) {
+  if (!_setupICU(
       systemIcuVersion: systemIcuVersion, specialIcuLibPath: specialIcuLib)) {
     return;
   }
 
-  print("Skipping problem locales $skipLocales.");
-  testdata35.compactNumberTestData
-      .removeWhere((k, v) => skipLocales!.contains(k));
+  void validate(String locale, List<List<String>> expected) {
+    _validateShort(locale, expected, skipLocales);
+    _validateLong(locale, expected, skipLocales);
+  }
+
   testdata35.compactNumberTestData.forEach(validate);
-  more_testdata.cldr35CompactNumTests.forEach(validateFancy);
+  more_testdata.cldr35CompactNumTests.forEach(_validateFancy);
 
   test('UNumberFormatter simple integer formatting', () {
-    expect(FormatWithUnumf('en', 'precision-integer', 5142.3), '5,142');
+    expect(_formatWithUnumf('en', 'precision-integer', 5142.3), '5,142');
   });
 }
 
-void validate(String locale, List<List<String>> expected) {
-  validateShort(locale, expected);
-  validateLong(locale, expected);
-}
-
-void validateShort(String locale, List<List<String>> expected) {
+void _validateShort(
+    String locale, List<List<String>> expected, Set<String> skipLocales) {
+  var skip =
+      skipLocales.contains(locale) ? 'Skipping problem locale $locale' : false;
   test('Validate $locale SHORT', () {
     for (var data in expected) {
       var number = num.parse(data.first);
-      expect(FormatWithUnumf(locale, 'compact-short', number), data[1]);
+      expect(_formatWithUnumf(locale, 'compact-short', number), data[1]);
     }
-  });
+  }, skip: skip);
 }
 
-void validateLong(String locale, List<List<String>> expected) {
+void _validateLong(
+    String locale, List<List<String>> expected, Set<String> skipLocales) {
+  var skip =
+      skipLocales.contains(locale) ? 'Skipping problem locale $locale' : false;
   test('Validate $locale LONG', () {
     for (var data in expected) {
       var number = num.parse(data.first);
-      expect(FormatWithUnumf(locale, 'compact-long', number), data[2]);
+      expect(_formatWithUnumf(locale, 'compact-long', number), data[2]);
     }
-  });
+  }, skip: skip);
 }
 
-void validateFancy(more_testdata.CompactRoundingTestCase t) {
+void _validateFancy(more_testdata.CompactRoundingTestCase t) {
   var locale = 'en';
   var skel = 'compact-short';
   if (t.minimumIntegerDigits != null) {
@@ -84,7 +88,7 @@
     skel += ' .' + '#' * t.maximumFractionDigits!;
   }
   test(t.toString(), () {
-    expect(FormatWithUnumf(locale, skel, t.number), t.expected,
+    expect(_formatWithUnumf(locale, skel, t.number), t.expected,
         reason: 'Skeleton: $skel');
   });
 }
@@ -106,7 +110,7 @@
 ///
 /// If [systemIcuVersion] is unspecified, we expect to find all functions in a
 /// library with filename [specialIcuLibPath].
-bool setupICU({int? systemIcuVersion, String? specialIcuLibPath}) {
+bool _setupICU({int? systemIcuVersion, String? specialIcuLibPath}) {
   DynamicLibrary libicui18n;
   String icuVersionSuffix;
   if (systemIcuVersion != null) {
@@ -152,7 +156,7 @@
   return true;
 }
 
-String FormatWithUnumf(String locale, String skeleton, num number) {
+String _formatWithUnumf(String locale, String skeleton, num number) {
   // // Setup:
   // UErrorCode ec = U_ZERO_ERROR;
   // UNumberFormatter* uformatter =
diff --git a/test/number_format_compact_test.dart b/test/number_format_compact_test.dart
index f645cc0..1545815 100644
--- a/test/number_format_compact_test.dart
+++ b/test/number_format_compact_test.dart
@@ -7,6 +7,7 @@
 
 import 'package:fixnum/fixnum.dart';
 import 'package:intl/intl.dart';
+import 'package:intl/number_symbols_data.dart';
 import 'package:intl/number_symbols_data.dart' as patterns;
 import 'package:test/test.dart';
 
@@ -21,13 +22,43 @@
 //  'mn' : [['4321', '4.32M', 'whatever']]
 };
 
+var compactWithPatternCases = <List<String>>[
+  ['0.012', '+0.01', '+0.01'],
+  ['0.123', '+0.12', '+0.12'],
+  ['1.234', '+1.23', '+1.23'],
+  ['12.34', '+12.3', '+12.3'],
+  ['123.4', '+123', '+123'],
+  ['123.41', '+123', '+123'],
+  ['1234.1', '+1.23K', '+1.23 thousand'],
+  ['12341', '+12.3K', '+12.3 thousand'],
+  ['123412', '+123K', '+123 thousand'],
+  ['1234123', '+1.23M', '+1.23 million'],
+  ['12341234', '+12.3M', '+12.3 million'],
+  ['123412341', '+123M', '+123 million'],
+  ['1234123412', '+1.23B', '+1.23 billion'],
+  ['-0.012', '-0.01', '-0.01'],
+  ['-0.123', '-0.12', '-0.12'],
+  ['-1.234', '-1.23', '-1.23'],
+  ['-12.34', '-12.3', '-12.3'],
+  ['-123.4', '-123', '-123'],
+  ['-123.41', '-123', '-123'],
+  ['-1234.1', '-1.23K', '-1.23 thousand'],
+  ['-12341', '-12.3K', '-12.3 thousand'],
+  ['-123412', '-123K', '-123 thousand'],
+  ['-1234123', '-1.23M', '-1.23 million'],
+  ['-12341234', '-12.3M', '-12.3 million'],
+  ['-123412341', '-123M', '-123 million'],
+  ['-1234123412', '-1.23B', '-1.23 billion'],
+];
+
 void main() {
-  interestingCases.forEach(validate);
-  testdata33.compactNumberTestData.forEach(validate);
-  more_testdata.oldIntlCompactNumTests.forEach(validateFancy);
+  interestingCases.forEach(_validate);
+  testdata33.compactNumberTestData.forEach(_validate);
+  more_testdata.oldIntlCompactNumTests.forEach(_validateFancy);
   // Once code and data is updated to CLDR35:
   // testdata35.compactNumberTestData.forEach(validate);
   // more_testdata.cldr35CompactNumTests.forEach(validateFancy);
+  compactWithPatternCases.forEach(_validateWithPattern);
 
   test("Patterns are consistent across locales", () {
     patterns.compactNumberSymbols.forEach((locale, patterns) {
@@ -141,7 +172,7 @@
 // case.
 // TODO(alanknight): Fix the problems, or at least figure out precisely where
 // the differences are.
-var problemLocalesShort = [
+var _skipLocalsShort = {
   'am', // AM Suffixes differ, not sure why.
   'ca', // For CA, CLDR rules are different. Jumps from 0000 to 00 prefix, so
   // 11 digits prints as 11900.
@@ -169,7 +200,7 @@
   'tr', // TR Doesn't have a 0B format, goes directly to 00B, as a result 54321
   // just prints as 54321
   'ur', // UR Fails one with Expected: '15 ٹریلین'  Actual: '150 کھرب'
-];
+};
 
 /// Locales that have problems in the long format.
 ///
@@ -180,7 +211,7 @@
 ///
 //TODO(alanknight): Narrow these down to particular numbers. Often it's just
 // 999999.
-var problemLocalesLong = [
+var _skipLocalesLong = {
   'ar', 'ar_DZ', 'ar_EG',
   'be', 'bg', 'bs',
   'ca', 'cs', 'da', 'de', 'de_AT', 'de_CH', 'el', 'es', 'es_419', 'es_ES',
@@ -202,55 +233,53 @@
   'sk', 'sl', 'sr', 'sr_Latn', 'sv', 'te', 'tl',
   'ur',
   'uk',
-];
+};
 
-void validate(String locale, List<List<String>> expected) {
-  validateShort(locale, expected);
-  validateLong(locale, expected);
+void _validate(String locale, List<List<String>> expected) {
+  _validateShort(locale, expected);
+  _validateLong(locale, expected);
 }
 
 /// Check each bit of test data against the short compact format, both
 /// formatting and parsing.
-void validateShort(String locale, List<List<String>> expected) {
-  if (problemLocalesShort.contains(locale)) {
-    print("Skipping problem locale '$locale' for SHORT compact number tests");
-    return;
-  }
+void _validateShort(String locale, List<List<String>> expected) {
+  var skip = _skipLocalsShort.contains(locale)
+      ? "Skipping problem locale '$locale' for SHORT compact number tests"
+      : false;
   var shortFormat = NumberFormat.compact(locale: locale);
   test('Validate $locale SHORT', () {
     for (var data in expected) {
       var number = num.parse(data.first);
-      validateNumber(number, shortFormat, data[1]);
+      _validateNumber(number, shortFormat, data[1]);
       var int64Number = Int64(number as int);
-      validateNumber(int64Number, shortFormat, data[1]);
+      _validateNumber(int64Number, shortFormat, data[1]);
       // TODO(alanknight): Make this work for MicroMoney
     }
-  });
+  }, skip: skip);
 }
 
-void validateLong(String locale, List<List<String>> expected) {
-  if (problemLocalesLong.contains(locale)) {
-    print("Skipping problem locale '$locale' for LONG compact number tests");
-    return;
-  }
+void _validateLong(String locale, List<List<String>> expected) {
+  var skip = _skipLocalesLong.contains(locale)
+      ? "Skipping problem locale '$locale' for LONG compact number tests"
+      : false;
   var longFormat = NumberFormat.compactLong(locale: locale);
   test('Validate $locale LONG', () {
     for (var data in expected) {
       var number = num.parse(data.first);
-      validateNumber(number, longFormat, data[2]);
+      _validateNumber(number, longFormat, data[2]);
     }
-  });
+  }, skip: skip);
 }
 
-void validateNumber(number, NumberFormat format, String expected) {
+void _validateNumber(number, NumberFormat format, String expected) {
   var formatted = format.format(number);
-  var ok = closeEnough(formatted, expected);
+  var ok = _closeEnough(formatted, expected);
   if (!ok) {
     expect(
         '$formatted ${formatted.codeUnits}', '$expected ${expected.codeUnits}');
   }
   var parsed = format.parse(formatted);
-  var rounded = roundForPrinting(number, format);
+  var rounded = _roundForPrinting(number, format);
   expect((parsed - rounded) / rounded < 0.001, isTrue);
 }
 
@@ -258,7 +287,7 @@
 /// number that will round to print differently depending on the number
 /// of significant digits, we need to check that as well, e.g.
 /// 999999 may print as 1M.
-num roundForPrinting(number, NumberFormat format) {
+num _roundForPrinting(number, NumberFormat format) {
   var originalLength = NumberFormat.numberOfIntegerDigits(number);
   var additionalDigits = originalLength - format.significantDigits!;
   if (additionalDigits > 0) {
@@ -280,7 +309,7 @@
 /// currently producing and the CLDR data. So if the strings differ only in the
 /// presence or absence of a period at the end or of a space between the number
 /// and the suffix, consider it close enough and return true.
-bool closeEnough(String result, String reference) {
+bool _closeEnough(String result, String reference) {
   var expected = reference.replaceAll(' ', _nbspString);
   if (result == expected) {
     return true;
@@ -315,7 +344,7 @@
       expectedDifference <= 1;
 }
 
-void validateFancy(more_testdata.CompactRoundingTestCase t) {
+void _validateFancy(more_testdata.CompactRoundingTestCase t) {
   var shortFormat = NumberFormat.compact(locale: 'en');
   if (t.maximumIntegerDigits != null) {
     shortFormat.maximumIntegerDigits = t.maximumIntegerDigits!;
@@ -345,3 +374,21 @@
     expect(shortFormat.format(t.number), t.expected);
   });
 }
+
+void _validateWithPattern(List<String> testData) {
+  final locale = 'en_US';
+  final currentLocale = Intl.verifiedLocale(locale, NumberFormat.localeExists);
+  final symbols = numberFormatSymbols[currentLocale];
+  final pattern = '${symbols.PLUS_SIGN}${symbols.DECIMAL_PATTERN};'
+      '${symbols.MINUS_SIGN}${symbols.DECIMAL_PATTERN}';
+  final input = num.parse(testData[0]);
+  test('Validate compact with $locale and $pattern', () {
+    final numberFormat = NumberFormat.compact(locale: locale, pattern: pattern);
+    expect(testData[1], numberFormat.format(input));
+  });
+  test('Validate compactLong with $locale and $pattern', () {
+    final numberFormat =
+        NumberFormat.compactLong(locale: locale, pattern: pattern);
+    expect(testData[2], numberFormat.format(input));
+  });
+}
diff --git a/test/number_format_compact_web_test.dart b/test/number_format_compact_web_test.dart
index 8738a14..b211f56 100644
--- a/test/number_format_compact_web_test.dart
+++ b/test/number_format_compact_web_test.dart
@@ -13,15 +13,15 @@
 import 'more_compact_number_test_data.dart' as more_testdata;
 
 void main() {
-  testdata35.compactNumberTestData.forEach(validate);
-  more_testdata.cldr35CompactNumTests.forEach(validateMore);
+  testdata35.compactNumberTestData.forEach(_validate);
+  more_testdata.cldr35CompactNumTests.forEach(_validateMore);
 
   test('RTL currency formatting', () {
     var basic = intl.NumberFormat.currency(locale: 'he');
     expect(basic.format(1234), '\u200F1,234.00 ILS');
     basic = intl.NumberFormat.currency(locale: 'he', symbol: '₪');
     expect(basic.format(1234), '\u200F1,234.00 ₪');
-    expect(ecmaFormatNumber('he', 1234, style: 'currency', currency: 'ILS'),
+    expect(_ecmaFormatNumber('he', 1234, style: 'currency', currency: 'ILS'),
         '\u200F1,234.00 ₪');
 
     var compact = intl.NumberFormat.compactCurrency(locale: 'he');
@@ -32,19 +32,19 @@
     expect(compact.format(1234), '₪ \u200F1.23K');
     // ECMAScript skips the RTL character for notation:'compact':
     expect(
-        ecmaFormatNumber('he', 1234,
+        _ecmaFormatNumber('he', 1234,
             style: 'currency', currency: 'ILS', notation: 'compact'),
         '₪ 1.2K');
     // short/long compactDisplay doesn't change anything here:
     expect(
-        ecmaFormatNumber('he', 1234,
+        _ecmaFormatNumber('he', 1234,
             style: 'currency',
             currency: 'ILS',
             notation: 'compact',
             compactDisplay: 'short'),
         '₪ 1.2K');
     expect(
-        ecmaFormatNumber('he', 1234,
+        _ecmaFormatNumber('he', 1234,
             style: 'currency',
             currency: 'ILS',
             notation: 'compact',
@@ -56,7 +56,7 @@
   });
 }
 
-String ecmaFormatNumber(String locale, num number,
+String _ecmaFormatNumber(String locale, num number,
     {String? style,
     String? currency,
     String? notation,
@@ -71,60 +71,59 @@
   return js.callMethod(number, 'toLocaleString', [locale, options]);
 }
 
-var ecmaProblemLocalesShort = [
+var _unsupportedChromeLocales = {
   // Not supported in Chrome:
   'af', 'az', 'be', 'br', 'bs', 'eu', 'ga', 'gl', 'gsw', 'haw', 'hy', 'is',
   'ka', 'kk', 'km', 'ky', 'ln', 'lo', 'mk', 'mn', 'mt', 'my', 'ne', 'no',
-  'no-NO', 'or', 'pa', 'si', 'sq', 'ur', 'uz', 'ps',
+  'no-NO', 'or', 'pa', 'si', 'sq', 'ur', 'uz', 'ps', 'chr', 'cy', 'tl', 'zu'
+};
+
+var _skipLocalesShort = [
+  'am', 'bn', 'fa', // Some results change in chrome 88
+  ..._unsupportedChromeLocales
 ];
 
-var ecmaProblemLocalesLong = ecmaProblemLocalesShort +
-    [
-      // Short happens to match 'en', but actually not in Chrome:
-      'chr', 'cy', 'tl', 'zu'
-    ];
+var _skipLocalesLong = _unsupportedChromeLocales;
 
-String fixLocale(String locale) {
+String _fixLocale(String locale) {
   return locale.replaceAll('_', '-');
 }
 
-void validate(String locale, List<List<String>> expected) {
-  validateShort(fixLocale(locale), expected);
-  validateLong(fixLocale(locale), expected);
+void _validate(String locale, List<List<String>> expected) {
+  _validateShort(_fixLocale(locale), expected);
+  _validateLong(_fixLocale(locale), expected);
 }
 
-void validateShort(String locale, List<List<String>> expected) {
-  if (ecmaProblemLocalesShort.contains(locale)) {
-    print("Skipping problem locale '$locale' for SHORT compact number tests");
-    return;
-  }
+void _validateShort(String locale, List<List<String>> expected) {
+  var skip = _skipLocalesShort.contains(locale)
+      ? "Skipping problem locale '$locale' for SHORT compact number tests"
+      : false;
 
   test('Validate $locale SHORT', () {
     for (var data in expected) {
       var number = num.parse(data.first);
-      expect(ecmaFormatNumber(locale, number, notation: 'compact'), data[1]);
+      expect(_ecmaFormatNumber(locale, number, notation: 'compact'), data[1]);
     }
-  });
+  }, skip: skip);
 }
 
-void validateLong(String locale, List<List<String>> expected) {
-  if (ecmaProblemLocalesLong.contains(locale)) {
-    print("Skipping problem locale '$locale' for LONG compact number tests");
-    return;
-  }
+void _validateLong(String locale, List<List<String>> expected) {
+  var skip = _skipLocalesLong.contains(locale)
+      ? "Skipping problem locale '$locale' for LONG compact number tests"
+      : false;
 
   test('Validate $locale LONG', () {
     for (var data in expected) {
       var number = num.parse(data.first);
       expect(
-          ecmaFormatNumber(locale, number,
+          _ecmaFormatNumber(locale, number,
               notation: 'compact', compactDisplay: 'long'),
           data[2]);
     }
-  });
+  }, skip: skip);
 }
 
-void validateMore(more_testdata.CompactRoundingTestCase t) {
+void _validateMore(more_testdata.CompactRoundingTestCase t) {
   var options = js.newObject();
   js.setProperty(options, 'notation', 'compact');
   if (t.maximumIntegerDigits != null) {
