Since Java 12 we can format numbers in a compact style with the CompactNumberFormat
class in the java.text
package. A number like 23000 is formatted as 23K for the English locale. Instead of the short representation of K for 1000 we can also use a longer style where K is transformed as thousand for the English locale. We can use the same class to parse a String value that is in the compact style into a number.
In the following example we use several options of the CompactNumberFormat
class:
package mrhaki.text; import java.text.NumberFormat; import java.text.ParseException; import java.util.Locale; public class CompactNumberFormat { public static void main(String[] args) throws ParseException { // When we would use NumberFormat.getCompactNumberInstance() the default system Locale // is used with the short style. // Create formatter for UK Locale and short style. NumberFormat nf = NumberFormat.getCompactNumberInstance(Locale.UK, NumberFormat.Style.SHORT); assert "23K".equals(nf.format(23_000)); assert "23K".equals(nf.format(23_491)); assert "24K".equals(nf.format(23_791)); assert "4M".equals(nf.format(4_250_392)); nf.setMinimumFractionDigits(1); assert "4.3M".equals(nf.format(4_250_392)); nf.setMaximumFractionDigits(3); assert "4.25M".equals(nf.format(4_250_392)); // We can also parse the String value back to a number. assert Long.valueOf(23491).equals(nf.parse("23.491K")); // Instead of a short style we can also use a long style. nf = NumberFormat.getCompactNumberInstance(Locale.UK, NumberFormat.Style.LONG); assert "23 thousand".equals(nf.format(23_000)); assert "4 million".equals(nf.format(4_250_392)); // We can specify the minimum fraction digits to be used in the formatted number. nf.setMinimumFractionDigits(1); assert "4.3 million".equals(nf.format(4_250_392)); // And the maximum fraction digits to change the ouput. nf.setMaximumFractionDigits(3); assert "4.25 million".equals(nf.format(4_250_392)); // If we would use another locale we can see the output will be changed // if applicable. Locale dutch = new Locale("nl", "NL"); nf = NumberFormat.getCompactNumberInstance(dutch, NumberFormat.Style.SHORT); assert "23K".equals(nf.format(23_230)); nf = NumberFormat.getCompactNumberInstance(dutch, NumberFormat.Style.LONG); assert "23 duizend".equals(nf.format(23_230)); } }
Written with Java 15.