@@ -173,7 +173,7 @@ public void writePrimitive(Json5Primitive primitive) throws IOException {
173173 writer .write (quote (instant .toString ()));
174174 }
175175 } else if (primitive .isNumber ()) {
176- writer .append (formatNumberString (primitive .getAsString ()));
176+ writer .append (formatNumberString (primitive .getAsString (), primitive . getNumberRadix () ));
177177 } else {
178178 writer .append (primitive .getAsString ());
179179 }
@@ -276,25 +276,49 @@ public void writeArray(Json5Array array, int depth) throws IOException {
276276
277277 writer .append (']' );
278278 }
279-
280- public String applyNumberSeparator (String numberString , char separator ) {
279+ private String applyNumberSeparator (String numberString , int numberRadix , char separator ) {
281280 StringBuilder sb = new StringBuilder (numberString );
281+
282+ boolean hasSign = numberString .startsWith ("+" ) || numberString .startsWith ("-" );
283+ int offset , separatorOffset ;
284+
285+ switch (numberRadix ) {
286+ case 2 :
287+ offset = hasSign ? 3 : 2 ;
288+ separatorOffset = 4 ;
289+ break ;
290+ case 8 :
291+ offset = hasSign ? 3 : 2 ;
292+ separatorOffset = 3 ;
293+ break ;
294+ case 10 :
295+ offset = 0 ;
296+ separatorOffset = 3 ;
297+ break ;
298+ case 16 :
299+ offset = hasSign ? 3 : 2 ;
300+ separatorOffset = 2 ;
301+ break ;
302+ default :
303+ throw new IllegalArgumentException ("Invalid number radix: " + numberRadix );
304+ }
305+
282306 int len = sb .length ();
283307
284- for (int i = len - 3 ; i > 0 ; i -= 3 ) {
308+ for (int i = len - separatorOffset ; i > offset ; i -= separatorOffset ) {
285309 sb .insert (i , separator );
286310 }
287311
288312 return sb .toString ();
289313 }
290314
291- public String formatNumberString (String numberString ) {
315+ public String formatNumberString (String numberString , int numberRadix ) {
292316 var strategy = options .getDigitSeparatorStrategy ();
293317 switch (strategy ) {
294318 case JAVA_STYLE :
295- return applyNumberSeparator (numberString , '_' );
319+ return applyNumberSeparator (numberString , numberRadix , '_' );
296320 case C_STYLE :
297- return applyNumberSeparator (numberString , '\'' );
321+ return applyNumberSeparator (numberString , numberRadix , '\'' );
298322 default :
299323 return numberString ;
300324 }
0 commit comments