Index: src/wp-includes/formatting.php
===================================================================
--- src/wp-includes/formatting.php	(revision 28763)
+++ src/wp-includes/formatting.php	(working copy)
@@ -107,17 +107,17 @@
 			$dynamic[ '/\'(\d\d)\'(?=\Z|[.,)}>\-\]]|' . $spaces . ')/' ] = $apos . '$1' . $closing_single_quote;
 		}
 
-		// '99 '99s '99's (apostrophe)  But never '9 or '999 or '99.0.
+		// '99 '99s '99's (apostrophe)  But never '9 or '99% or '999 or '99.0.
 		if ( "'" !== $apos ) {
-			$dynamic[ '/\'(?=\d\d(?:\Z|(?!\d|[.,]\d)))/' ] = $apos;
+			$dynamic[ '/\'(?=\d\d(?:\Z|(?![%\d]|[.,]\d)))/' ] = $apos;
 		}
 
 		// Quoted Numbers like "42" or '42.00'
 		if ( '"' !== $opening_quote && '"' !== $closing_quote ) {
-			$dynamic[ '/(?<=\A|' . $spaces . ')"(\d[\d\.\,]*)"/' ] = $opening_quote . '$1' . $closing_quote;
+			$dynamic[ '/(?<=\A|' . $spaces . ')"(\d[.,\d]*)"/' ] = $opening_quote . '$1' . $closing_quote;
 		}
 		if ( "'" !== $opening_single_quote && "'" !== $closing_single_quote ) {
-			$dynamic[ '/(?<=\A|' . $spaces . ')\'(\d[\d\.\,]*)\'/' ] = $opening_single_quote . '$1' . $closing_single_quote;
+			$dynamic[ '/(?<=\A|' . $spaces . ')\'(\d[.,\d]*)\'/' ] = $opening_single_quote . '$1' . $closing_single_quote;
 		}
 
 		// Single quote at start, or preceded by (, {, <, [, ", -, or spaces.
Index: tests/phpunit/tests/formatting/WPTexturize.php
===================================================================
--- tests/phpunit/tests/formatting/WPTexturize.php	(revision 28763)
+++ tests/phpunit/tests/formatting/WPTexturize.php	(working copy)
@@ -313,8 +313,8 @@
 				"word &#8217;99&#8217;s word",
 			),
 			array(
-				"according to our source, '33% of all students scored less than 50' on the test.", // Apostrophes and primes have priority over quotes
-				"according to our source, &#8217;33% of all students scored less than 50&#8242; on the test.",
+				"according to our source, '33 students scored less than 50' on the test.", // Apostrophes and primes have priority over quotes
+				"according to our source, &#8217;33 students scored less than 50&#8242; on the test.",
 			),
 		);
 	}
@@ -1060,12 +1060,12 @@
 				'word &#8220;4,242.00&#8221; word',
 			),
 			array(
-				"word '99's word", // Is this correct?
-				"word &#8216;99&#8217;s word",
+				"word '99's word",
+				"word &#8217;99&#8217;s word",
 			),
 			array(
 				"word '99'samsonite",
-				"word &#8216;99&#8217;samsonite",
+				"word &#8217;99&#8217;samsonite",
 			),
 		);
 	}
@@ -1341,6 +1341,10 @@
 				"word &#8216;999 word",
 			),
 			array(
+				"word '99% word",
+				"word &#8216;99% word",
+			),
+			array(
 				"word '9 word",
 				"word &#8216;9 word",
 			),
