@@ -138,16 +138,15 @@ function (array $args) {
138
138
*/
139
139
public static function getOutputFormatDataProvider (): array
140
140
{
141
- $ ar_DZ = "\u{062C}. \u{0645}. \u{200F}\u{00A0}%s " ;
142
- if (version_compare (PHP_VERSION , '8.3 ' , '>= ' )) {
143
- $ ar_DZ = "%s \u{00A0}\u{062C}. \u{0645}. \u{200F}" ;
144
- }
141
+ // Use dynamic detection for problematic locale/currency combinations!
142
+ $ ar_DZ_EGP = self ::getExpectedFormatForLocale ('ar_DZ ' , 'EGP ' );
143
+
145
144
return [
146
145
'en_US:USD ' => ['en_US ' , 'USD ' , '$%s ' ],
147
146
'en_US:PLN ' => ['en_US ' , 'PLN ' , "PLN \u{00A0}%s " ],
148
147
'en_US:PKR ' => ['en_US ' , 'PKR ' , "PKR \u{00A0}%s " ],
149
148
'af_ZA:VND ' => ['af_ZA ' , 'VND ' , "\u{20AB}%s " ],
150
- 'ar_DZ:EGP ' => ['ar_DZ ' , 'EGP ' , $ ar_DZ ],
149
+ 'ar_DZ:EGP ' => ['ar_DZ ' , 'EGP ' , $ ar_DZ_EGP ],
151
150
'ar_SA:USD ' => ['ar_SA ' , 'USD ' , "%s \u{00A0}US$ " ],
152
151
'ar_SA:LBP ' => ['ar_SA ' , 'LBP ' , "%s \u{00A0}\u{0644}. \u{0644}. \u{200F}" ],
153
152
'fa_IR:USD ' => ['fa_IR ' , 'USD ' , "\u{200E}$%s " ],
@@ -162,6 +161,62 @@ public static function getOutputFormatDataProvider(): array
162
161
];
163
162
}
164
163
164
+ /**
165
+ * Get expected format for a specific locale/currency combination
166
+ * This handles cases where intl extension version affects formatting
167
+ *
168
+ * @param string $locale
169
+ * @param string $currency
170
+ * @return string
171
+ */
172
+ private static function getExpectedFormatForLocale (string $ locale , string $ currency ): string
173
+ {
174
+ // Define known problematic combinations and their expected formats
175
+ $ problematicFormats = [
176
+ 'ar_DZ:EGP ' => [
177
+ 'old ' => "\u{062C}. \u{0645}. \u{200F}\u{00A0}%s " ,
178
+ 'new ' => "%s \u{00A0}\u{062C}. \u{0645}. \u{200F}"
179
+ ]
180
+ ];
181
+
182
+ $ key = $ locale . ': ' . $ currency ;
183
+
184
+ if (isset ($ problematicFormats [$ key ])) {
185
+ // Check if we're using a newer intl version that changes formatting
186
+ if (self ::isNewerIntlVersion ()) {
187
+ return $ problematicFormats [$ key ]['new ' ];
188
+ }
189
+ return $ problematicFormats [$ key ]['old ' ];
190
+ }
191
+
192
+ // For non-problematic combinations, return a default format
193
+ // This could be enhanced with more specific formats as needed
194
+ return "%s " ;
195
+ }
196
+
197
+ /**
198
+ * Check if the current intl extension version uses newer formatting rules
199
+ *
200
+ * @return bool
201
+ */
202
+ private static function isNewerIntlVersion (): bool
203
+ {
204
+ // Check intl extension version
205
+ if (extension_loaded ('intl ' )) {
206
+ $ intlVersion = INTL_ICU_VERSION ?? '0.0.0 ' ;
207
+
208
+ // ICU 72+ (released around 2022) introduced changes to RTL formatting
209
+ // This is a more reliable indicator than PHP version
210
+ if (version_compare ($ intlVersion , '72.0 ' , '>= ' )) {
211
+ return true ;
212
+ }
213
+ }
214
+
215
+ // Fallback: Check PHP version as a rough indicator
216
+ // This is less reliable but provides some backward compatibility
217
+ return version_compare (PHP_VERSION , '8.3 ' , '>= ' );
218
+ }
219
+
165
220
/**
166
221
* @dataProvider getFormatTxtNumberFormatterDataProvider
167
222
* @param string $locale
0 commit comments