Я могу вспомнить множество случаев, когда я видел, как другие пишут ненужный Java-код, и я писал ненужный Java-код из-за недостаточной осведомленности о классе JDK, который уже обеспечивает желаемую функциональность. Одним из примеров этого является запись связанных со временем констант с использованием жестко закодированных значений, таких как 60 , 24 , 1440 и 86400, когда TimeUnit обеспечивает лучший стандартизированный подход. В этом посте я рассмотрю еще один пример класса, который предоставляет функциональность, которую я часто видел разработчиками, — NumberFormat .
Класс NumberFormat является частью пакета java.text , который также включает часто используемые классы DateFormat и SimpleDateFormat . NumberFormat является абстрактным классом (без открытого конструктора), и экземпляры его потомков получают с помощью перегруженных статических методов с именами, такими как getInstance () , getCurrencyInstance () и getPercentInstance () .
валюта
Следующий листинг кода демонстрирует вызов NumberFormat.getCurrencyInstance (Locale) для получения экземпляра, NumberFormat
который представляет числа в удобном для валюты формате.
Демонстрация поддержки валюты NumberFormat
/** * Demonstrate use of a Currency Instance of NumberFormat. */ public void demonstrateCurrency() { writeHeaderToStandardOutput("Currency NumberFormat Examples"); final NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(Locale.US); out.println("15.5 -> " + currencyFormat.format(15.5)); out.println("15.54 -> " + currencyFormat.format(15.54)); out.println("15.345 -> " + currencyFormat.format(15.345)); // rounds to two decimal places printCurrencyDetails(currencyFormat.getCurrency()); } /** * Print out details of provided instance of Currency. * * @param currency Instance of Currency from which details * will be written to standard output. */ public void printCurrencyDetails(final Currency currency) { out.println("Concurrency: " + currency); out.println("\tISO 4217 Currency Code: " + currency.getCurrencyCode()); out.println("\tISO 4217 Numeric Code: " + currency.getNumericCode()); out.println("\tCurrency Display Name: " + currency.getDisplayName(Locale.US)); out.println("\tCurrency Symbol: " + currency.getSymbol(Locale.US)); out.println("\tCurrency Default Fraction Digits: " + currency.getDefaultFractionDigits()); }
Когда приведенный выше код выполняется, результаты будут такими, как показано ниже:
================================================================================== = Currency NumberFormat Examples ================================================================================== 15.5 -> $15.50 15.54 -> $15.54 15.345 -> $15.35 Concurrency: USD ISO 4217 Currency Code: USD ISO 4217 Numeric Code: 840 Currency Display Name: US Dollar Currency Symbol: $ Currency Default Fraction Digits: 2
Приведенный выше код и связанный с ним вывод демонстрируют, что NumberFormat
экземпляр, используемый для валюты (на самом деле a DecimalFormat
), автоматически применяет соответствующее количество цифр и соответствующий символ валюты на основе локали.
Процентное соотношение
Следующие списки кодов и соответствующие выходные данные демонстрируют использование NumberFormat
для представления чисел в процентном формате.
Демонстрация формата процента NumberFormat
/** * Demonstrate use of a Percent Instance of NumberFormat. */ public void demonstratePercentage() { writeHeaderToStandardOutput("Percentage NumberFormat Examples"); final NumberFormat percentageFormat = NumberFormat.getPercentInstance(Locale.US); out.println("Instance of: " + percentageFormat.getClass().getCanonicalName()); out.println("1 -> " + percentageFormat.format(1)); // will be 0 because truncated to Integer by Integer division out.println("75/100 -> " + percentageFormat.format(75/100)); out.println(".75 -> " + percentageFormat.format(.75)); out.println("75.0/100 -> " + percentageFormat.format(75.0/100)); // will be 0 because truncated to Integer by Integer division out.println("83/93 -> " + percentageFormat.format((83/93))); out.println("93/83 -> " + percentageFormat.format(93/83)); out.println(".5 -> " + percentageFormat.format(.5)); out.println(".912 -> " + percentageFormat.format(.912)); out.println("---- Setting Minimum Fraction Digits to 1:"); percentageFormat.setMinimumFractionDigits(1); out.println("1 -> " + percentageFormat.format(1)); out.println(".75 -> " + percentageFormat.format(.75)); out.println("75.0/100 -> " + percentageFormat.format(75.0/100)); out.println(".912 -> " + percentageFormat.format(.912)); }
================================================================================== = Percentage NumberFormat Examples ================================================================================== 1 -> 100% 75/100 -> 0% .75 -> 75% 75.0/100 -> 75% 83/93 -> 0% 93/83 -> 100% .5 -> 50% .912 -> 91% ---- Setting Minimum Fraction Digits to 1: 1 -> 100.0% .75 -> 75.0% 75.0/100 -> 75.0% .912 -> 91.2%
Код и выходные данные процентного NumberFormat
использования демонстрируют, что по умолчанию экземпляр NumberFormat
(на самом деле a DecimalFormat
в данном случае), возвращаемый методом NumberFormat.getPercentInstance (Locale), не имеет дробных цифр, умножает предоставленное число на 100 (предполагается, что это десятичный эквивалент процента, когда предоставляется), и добавляет знак процента (%).
Целые
Небольшой объем кода, показанный далее, и связанный с ним вывод демонстрируют использование NumberFormat
для представления чисел в целочисленном формате.
Демонстрация целочисленного формата NumberFormat
/** * Demonstrate use of an Integer Instance of NumberFormat. */ public void demonstrateInteger() { writeHeaderToStandardOutput("Integer NumberFormat Examples"); final NumberFormat integerFormat = NumberFormat.getIntegerInstance(Locale.US); out.println("7.65 -> " + integerFormat.format(7.65)); out.println("7.5 -> " + integerFormat.format(7.5)); out.println("7.49 -> " + integerFormat.format(7.49)); out.println("-23.23 -> " + integerFormat.format(-23.23)); }
================================================================================== = Integer NumberFormat Examples ================================================================================== 7.65 -> 8 7.5 -> 8 7.49 -> 7 -23.23 -> -23
Как показано в приведенном выше коде и связанных выходных данных, NumberFormat
метод getIntegerInstance (Locale) возвращает экземпляр, который представляет предоставленные цифры в виде целых чисел.
Фиксированные цифры
Следующий листинг кода и связанный с ним вывод демонстрируют использование NumberFormat
для печати представления чисел с плавающей запятой с фиксированной запятой. Другими словами, это использование NumberFormat
позволяет представлять число с точно заданным количеством цифр слева от десятичной точки («целые» цифры) и справа от десятичной точки («дробные» цифры).
Демонстрация числового формата для чисел с фиксированной точкой
/** * Demonstrate generic NumberFormat instance with rounding mode, * maximum fraction digits, and minimum integer digits specified. */ public void demonstrateNumberFormat() { writeHeaderToStandardOutput("NumberFormat Fixed-Point Examples"); final NumberFormat numberFormat = NumberFormat.getNumberInstance(); numberFormat.setRoundingMode(RoundingMode.HALF_UP); numberFormat.setMaximumFractionDigits(2); numberFormat.setMinimumIntegerDigits(1); out.println(numberFormat.format(234.234567)); out.println(numberFormat.format(1)); out.println(numberFormat.format(.234567)); out.println(numberFormat.format(.349)); out.println(numberFormat.format(.3499)); out.println(numberFormat.format(0.9999)); }
================================================================================== = NumberFormat Fixed-Point Examples ================================================================================== 234.23 1 0.23 0.34 0.35 1
Вышеприведенный код и связанный с ним вывод демонстрируют точный контроль минимального количества «целых» цифр, которые должны быть представлены слева от десятичного разряда (по крайней мере, один, поэтому в случае необходимости отображается ноль), и максимального количества «дроби» цифры справа от десятичной точки. Хотя это и не показано, максимальное количество целых цифр и минимальное количество цифр дроби также могут быть указаны.
Вывод
Я использовал этот пост, чтобы посмотреть, как NumberFormat можно использовать для представления чисел по-разному (валюта, процент, целое число, фиксированное количество десятичных знаков и т. Д.), И часто означает, что для втискивания чисел в эти цифры не требуется писать или сокращать код. форматы. Когда я впервые начал писать этот пост, я предполагал включить в него примеры и обсуждение прямых потомков NumberFormat
( DecimalFormat и ChoiceFormat ), но решил, что этот пост уже достаточно длинный. Я могу написать об этих потомках NumberFormat
в будущих сообщениях в блоге.